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
的錯誤