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
的错误