前言
我的第一篇博客顶别,記錄操作系統(tǒng)的python小作業(yè)谷徙,該作業(yè)有如下要求:
- 讀取 .txt 文件,統(tǒng)計(jì)行數(shù)
- 將文件中的 制表符 換成 空格
讀取txt文件和其他文本文件一樣驯绎,所以這套代碼可以統(tǒng)計(jì)py文件行數(shù)或者c之類(lèi)的代碼行數(shù)完慧,感覺(jué)有點(diǎn)實(shí)用價(jià)值,第二問(wèn)也可以做到字符與字符的替換剩失。
思路
第一題
- 命令行輸入文件名字 # python test.py a.txt
- 讀取a.txt文件屈尼,用readlines()方法讀取行數(shù)
f.readlines() # 將文件以換行符處理, 生成列表返回
舉個(gè)??:
# 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()方法的作用,可以將 每一行 文本讀取出來(lái)赴叹,并且保存在一個(gè) list 之中鸿染,我們只需要計(jì)算這個(gè)list的長(zhǎng)度,就可以獲得這個(gè)文本的行數(shù)乞巧。
- 需要注意的是由于用 "\n" 作為換行的標(biāo)志涨椒,所以空行也存在"\n",用此方法會(huì)把空行也當(dāng)作一行文本處理
第二題
- 讀取文件
- 每行依次讀取,將每行中的需要替換的字符替換.
將第一題讀取的內(nèi)容用 .replace("\n", " ") 方法即可實(shí)現(xiàn)
content = "Because of you\n"
content = content.replace("\n", "")
print(content) # Because of you
# 第二問(wèn)我們用到 readline() 方法,該方法將文本一行一行讀取蚕冬,
# 而不是像readlines()那樣一次全部讀取到內(nèi)存中免猾,用這個(gè)方法
# 對(duì)于大文件可以較好完成任務(wù).
# 此外用for循環(huán)遍歷可以達(dá)到相同效果
f = open("a.txt", "r")
for i in f:
print(i, end=" ") # print方法自身會(huì)打印"\n",
# 我們的文本也會(huì)打印"\n",
# 因此這里我們不讓print方法打印\n
代碼(初步)(第一題)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8 -*-
"""
統(tǒng)計(jì)輸入文本的行數(shù)
@time: 2020-3-21
"""
__author__ = 'Luo-DH'
import argparse
def processing_parameter(parser):
"""該函數(shù)用于處理用戶(hù)命令行的輸入
Returns:
輸入的文件路徑 (string)
"""
parser.add_argument("path", help="需要讀取的文件的路徑")
args = parser.parse_args()
return args.path
def get_row_nums(path):
"""該函數(shù)用于得到文件的行數(shù)
Returns:
文件的行數(shù) (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))
測(cè)試(第一題)
python test.py test.py
# 54 test.py
代碼(初步)(第二題)
#!/home/luo/.virtualenvs/ENV_OS/bin/python3
# -*- coding:utf-8 -*-
"""
用指定的字符替換文本的內(nèi)容
@time: 2020-3-21
"""
__author__ = 'Luo-DH'
import argparse
def processing_parameter(parser):
"""該函數(shù)用于處理用戶(hù)命令行的輸入
Returns:
path: 用戶(hù)輸入文件的路徑
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):
"""該函數(shù)用于處理字符串的替換
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)
特別說(shuō)明一下
args = parser.parse_args()
char1 = args.char1.encode('utf-8').decode('unicode_escape')
char2 = args.char2.encode('utf-8').decode('unicode_escape')
# 如果沒(méi)有這段代碼,將無(wú)法實(shí)現(xiàn)\n\t這類(lèi)字符的轉(zhuǎn)換
參考鏈接: python 使用argparse 輸入分割符時(shí)囤热,例如\t猎提,無(wú)法分割字符
測(cè)試(第二題)
python test2.py a.txt "\n" "\t"
# 會(huì)在當(dāng)前目錄生成處理好的文件(a.txt.after)
結(jié)語(yǔ)
- 我的第一篇博客,記錄一下這個(gè)python小任務(wù)旁蔼,對(duì)于md書(shū)寫(xiě)還比較陌生锨苏,內(nèi)容上面如果有錯(cuò)誤歡迎提出,我還在學(xué)習(xí)中棺聊,有什么不懂的也可以聯(lián)系我伞租,共同進(jìn)步。
- 另外限佩,我將會(huì)更新這兩個(gè)小任務(wù)的class版本葵诈。