Python中文件操作先寫後讀輸出爲空的問題解決方案

Python中文件操作先寫後讀輸出爲空的問題解決方案

在Python中初次操作文件可能會嘗試先讀file.white()後寫file.read(),結果會發現明明已經寫入數據,但讀出內容依然爲空的問題。

如下例:

file = open('./a.txt', mode="a+", encoding="utf8")
file.write("123456")
str = file.read()
print(str)
# 讀出內容爲空
# a.txt 內容爲123456

造成這種問題的原因是,當寫入操作完成時,文件光標處於文件末尾處;接着繼續執行讀取操作,系統從光標處向後讀取,但光標已處於末尾,所以讀出內容爲空。

該問題有兩種解決方案:

方法一:規範代碼,將讀取操作與寫入操作分類,在一種操作執行結束後應及時關閉文件指針file.close()。使用這種方法可以是文件安全有效,不會被其他操作影響預計效果。
如下:

# 寫入
file = open('./a.txt', mode="w", encoding="utf8")
file.write("123456")
file.close()
# 讀取
file = open('./a.txt', mode="r", encoding="utf8")
str = file.read()
print(str)
# 輸出爲 123456
# a.txt 123456

方法二:使用seek()方法移動光標至指定位置

file.seek(offset,whence=0)

offset:偏移量,即需要移動偏移的字節數。

whence:要從哪個位置開始偏移,默認值爲0;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。

同時whence也可以使用常量名錶示(需要引入os模塊):
whence常量:
os.SEEK_SET: 0 相對文件起始位置
os.SEEK_CUR: 1 相對文件的當前位置
os.SEEK_END: 2 相對文件的結束位置

對於本問題,可以在寫入之後將光標從新移動至文件開頭位置,然後執行讀取操作

file = open('./a.txt', mode="a+", encoding="utf8")
file.write("123456")
# 表示移動0個位置,從文件開頭開始
file.seek(0, 0)
str = file.read()
print(str)
# 輸出爲 123456
# a.txt 123456

注意:Python3中不支持非二進制的文件光標移動位置且offset按位取值,所以非二進制文件建議只使用將光標移動到開頭或末尾的功能,即offset==0,避免出現io.UnsupportedOperation: can't do nonzero cur-relative seeks或者io.UnsupportedOperation: can't do nonzero end-relative seeks的錯誤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章