前言
我的第一篇博客,记录操作系统的python小作业,该作业有如下要求:
- 读取 .txt 文件,统计行数
- 将文件中的 制表符 换成 空格
读取txt文件和其他文本文件一样,所以这套代码可以统计py文件行数或者c之类的代码行数,感觉有点实用价值,第二问也可以做到字符与字符的替换。
思路
第一题
- 命令行输入文件名字 # python test.py a.txt
- 读取a.txt文件,用readlines()方法读取行数
f.readlines() # 将文件以换行符处理, 生成列表返回
举个:
# a.txt
Because of you
I never stray too far from the sidewalk
Because of you
I learned to play on the safe side so I don't get hurt
f = open("./a.txt", "r")
content = f.readlines()
print(content) # ['Because of you\n',
#'I never stray too far from the sidewalk\n',
#'Because of you\n',
#"I learned to play on the safe side so I don't get hurt\n"]
f.close()
由上面的小例子可以清晰地看到readlines()方法的作用,可以将 每一行 文本读取出来,并且保存在一个 list 之中,我们只需要计算这个list的长度,就可以获得这个文本的行数。
- 需要注意的是由于用 "\n" 作为换行的标志,所以空行也存在"\n",用此方法会把空行也当作一行文本处理
第二题
- 读取文件
- 每行依次读取,将每行中的需要替换的字符替换.
将第一题读取的内容用 .replace("\n", " ") 方法即可实现
content = "Because of you\n"
content = content.replace("\n", "")
print(content) # Because of you
# 第二问我们用到 readline() 方法,该方法将文本一行一行读取,
# 而不是像readlines()那样一次全部读取到内存中,用这个方法
# 对于大文件可以较好完成任务.
# 此外用for循环遍历可以达到相同效果
f = open("a.txt", "r")
for i in f:
print(i, end=" ") # print方法自身会打印"\n",
# 我们的文本也会打印"\n",
# 因此这里我们不让print方法打印\n
代码(初步)(第一题)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8 -*-
"""
统计输入文本的行数
@time: 2020-3-21
"""
__author__ = 'Luo-DH'
import argparse
def processing_parameter(parser):
"""该函数用于处理用户命令行的输入
Returns:
输入的文件路径 (string)
"""
parser.add_argument("path", help="需要读取的文件的路径")
args = parser.parse_args()
return args.path
def get_row_nums(path):
"""该函数用于得到文件的行数
Returns:
文件的行数 (int)
"""
f = open(path, "r")
content = f.readlines()
row_nums = len(content)
return row_nums
if __name__ == '__main__':
parser = argparse.ArgumentParser()
path = processing_parameter(parser)
row_nums = get_row_nums(path)
print("{} {}".format(row_nums, path))
测试(第一题)
python test.py test.py
# 54 test.py
代码(初步)(第二题)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8 -*-
"""
用指定的字符替换文本的内容
@time: 2020-3-21
"""
__author__ = 'Luo-DH'
import argparse
def processing_parameter(parser):
"""该函数用于处理用户命令行的输入
Returns:
path: 用户输入文件的路径
char1: 被替换的字符
char2: 用于替换的字符
"""
parser.add_argument("path", help="需要处理的文件路径")
parser.add_argument("char1", help="需要替换的字符")
parser.add_argument("char2", default=" ", help="用以替换的字符")
args = parser.parse_args()
char1 = args.char1.encode('utf-8').decode('unicode_escape')
char2 = args.char2.encode('utf-8').decode('unicode_escape')
return args.path, char1, char2
def replace_char(path, char1, char2):
"""该函数用于处理字符串的替换
Args:
path: 文件路径
char1: 需要替换的字符
char2: 用以替换的字符
"""
f = open(path, "r")
f2 = open(path+".after", "w")
for i, content in enumerate(f):
content = content.replace(char1, char2)
f2.write(content)
f.close()
f2.close()
if __name__ == "__main__":
parser = argparse.ArgumentParser()
path, char1, char2 = processing_parameter(parser)
replace_char(path, char1, char2)
特别说明一下
args = parser.parse_args()
char1 = args.char1.encode('utf-8').decode('unicode_escape')
char2 = args.char2.encode('utf-8').decode('unicode_escape')
# 如果没有这段代码,将无法实现\n\t这类字符的转换
参考链接: python 使用argparse 输入分割符时,例如\t,无法分割字符
测试(第二题)
python test2.py a.txt "\n" "\t"
# 会在当前目录生成处理好的文件(a.txt.after)
结语
- 我的第一篇博客,记录一下这个python小任务,对于md书写还比较陌生,内容上面如果有错误欢迎提出,我还在学习中,有什么不懂的也可以联系我,共同进步。
- 另外,我将会更新这两个小任务的class版本。