python3的文件讀寫模式


任何一種語言,文件的讀寫都是非常常見的。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,則讀取不到。

這特點能用戶增量讀取分析日志文件


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM