在python中处理文件时遇到了一个奇怪的问题。让我们说我有一个文本文件和一段简单的代码来读取文件的内容,然后用未改变的内容重写它。
FILE.TXT
这是一个测试文件
Python代码
f=open(File.txt,'r+')
data=f.read()
f.truncate(0)
f.write(data)
f.close()
运行上面的代码后File.txt
似乎是一样的。但是,当我在十六进制编辑器中打开它时,我很惊讶在文本文件的实际内容之前看到很多\x00
(NULL)字节,之前不是 。
有人可以解释一下吗?
答案 0 :(得分:9)
假设您的文件中有20个字节。所以f.read()
读取20个字节。现在您将文件截断为0字节。但是你的文件位置指针仍然是20.为什么不是?你没有动过它。所以当你写作时,你开始写第21个字节。你的操作系统用零填充了20个丢失的字节。
为了避免这种情况,f.seek(0)
再写一次。
答案 1 :(得分:1)
f.truncate(0)
将文件的所有字节设置为\x00
。但是,它不会更改文件指针 - 您仍然在调用read
之后的位置。因此,如果您编写任何内容,操作系统会将文件扩展到新的长度(原始长度+ len(data)
)。
为避免这种情况,请致电seek
:
with open('File.txt', 'r+') as f:
data=f.read()
f.seek(0)
f.truncate(0)
f.write(data)