2012-03-15 131 views
5

我在使用python中的文件时遇到了一个奇怪的问题。假设我有一个文本文件和一段简单的代码,它读取文件的内容,然后用未改变的内容重写它。Python的读取和写入将 x00添加到文件

FILE.TXT

这是一个测试文件

Python代码

f=open(File.txt,'r+') 
data=f.read() 
f.truncate(0) 
f.write(data) 
f.close() 

运行上述代码File.txt后似乎是相同的。但是,当我在十六进制编辑器中打开它时,我惊讶地发现在文本文件的实际内容之前看到很多\x00(NULL)字节,而之前并不是

任何人都可以解释一下吗?

回答

9

假设您的文件有20个字节。所以f.read()读取20个字节。现在您将文件截断为0个字节。但是你的文件中指针仍然是20.为什么它不是?你还没有移动它。所以当你写时,你开始写第21个字节。您的操作系统用零填充20个丢失的字节。

为了避免这种情况,f.seek(0)再次写入。

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) 
+0

不,不,不。 '.truncate'截断文件。而已;没有空字节。如果代码以'f.truncate(0)'结尾,则文件变成零大小。它是文件偏移量不是零的'.write',导致操作系统用空字节填充*未写入*字节(或者只是*假设*未写入的字节为空;它取决于文件系统)。 – tzot 2012-03-29 17:41:25