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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值