任何一種語言,文件的讀寫都是非常常見的。python的文件讀寫非常簡單,僅僅一個函數open(file也可以,但是我不常用)。
先看看官網的解釋:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
Open file and return a stream. Raise IOError upon failure.
常用打開模式:
r 只能讀
r+ 可讀可寫,不會創建不存在的文件,從頂部開始寫,會覆蓋之前此位置的內容
w+ 可讀可寫,如果文件存在,則覆蓋整個文件,不存在則創建
w 只能寫,覆蓋整個文件,不存在則創建
a 只能寫,從文件底部添加內容 不存在則創建
a+ 可讀可寫 從文件頂部讀取內容 從文件底部添加內容 不存在則創建
但是實驗發現,這里的r+ 可讀可寫 不會創建不存在的文件 從頂部開始寫 會覆蓋之前此位置的內容不完整。
test.txt的原始文件如下:
早上好
您好
how are you?
如果我們在open文件后,沒有進行任何讀寫,則從末尾加入
1 with open('test.txt', mode='r+', encoding='utf-8') as f: 2 f.writelines("北京")
這時文件變成
北京好
您好
how are you?
如果我們在寫之前進行了讀操作,則會在末尾加入文件
1 with open('test.txt', mode='r+', encoding='utf-8') as f: 2 f.read(1) 3 f.writelines("北京")
這時在文件的末尾加入了北京兩個字,與我們讀多少沒有關系。作用上類似a+模式
早上好
您好
how are you?北京
注意:以r+模式處理文件,容易弄錯內容,千萬注意
如果以w+方式打開文件,寫入文件后,文件被覆蓋或重建,樣例
1 with open('test.txt', mode='w+', encoding='utf-8') as f: 2 f.write("tianjin") 3 f.flush() 4 print(f.readlines())
得到空[]
with open('test.txt', mode='w+', encoding='utf-8') as f: f.writelines("天津") f.writelines('山東') f.flush() f.seek(0) print(f.readlines())
需要seek才能讀取到剛剛寫入的內容。
另外注意 寫操作不會自動加入換行符
讀的一行末尾會有換行操作,可以用''.strip()去掉換行符
with open('test.txt', mode='r', encoding='utf-8') as f: for line in f: print(line.strip()) 去掉換行
如果某個文件正在open,就只這時,文件被修改,正在讀文件的句柄能讀出修改的內容
1 import time 2 with open('test.txt', mode='r', encoding='utf-8') as f: 3 time.sleep(5) 4 for line in f: 5 print(line.strip())
在文件末尾增加文件時,我們的f能讀取到最后新增的內容。如果修改已經讀取行的內容,若不seek,則讀取不到。
這特點能用戶增量讀取分析日志文件
