今天写代码读写文件发现文件内容出现'\x00\x00\x00123',前面多了很多0。最后发现原来是自己truncate的姿势不对
先来看看truncate函数用法吧:truncate([size]),将文件截断为size大小,如果没给size,那么就截断到当前指针位置。如果size小于文件大小,那么size前的文件内容保留,size字节后的内容被删除,如果size大于文件的大小,那么多余的字节就以空字节(\0)补充,truncate是不会改变文件的指针。试验如下:
size=0的时候:
>>> f = open("/tmp/bbb","r+")
>>> f.read()
'abcdefg'<span style="font-family: Arial, Helvetica, sans-serif;">#此时文件内容为abcdefg</span>
>>> f.close()
>>> f = open("/tmp/bbb","r+")
>>> f.truncate(0)#截断为0,清除所有内容
>>> f.read()#此时文件内容为空
''
>>> f.close()
size不为0,但小于filesize的时候:
>>> f = open("/tmp/bbb","r+")
>>> f.read()
'abcdefg'#此时文件内容为abcdefg
>>> f.close()
>>> f = open("/tmp/bbb","r+")
>>> f.truncate(3)#将文件截断为3字节
>>> f.tell()#当前文件指针为0
0
>>> f.read()
'abc'#前三个字节内容abc保留,后面的内容被清除
>>> f.close()
>>> f = open("/tmp/bbb","r+")#上面处理结束后文件内容为abc
>>> f.seek(1) #第一个字节(b)
>>> f.truncate(1)#只保留a,bc都被清除
>>> f.read()#此时指针在第一个字节,但a后面没内容了
''
>>> f.close()
>>> f = open("/tmp/bbb","r+")
>>> f.read()
'a'
当size大于文件大小的时候:
>>> f = open("/tmp/bbb","r+")
>>> f.read()
'abcdefg'
>>> f.read()
''
>>> f = open("/tmp/bbb","r+")
>>> f.truncate(20)
>>> f.read()
'abcdefg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>> f.close()
可以看到,文件内容后面有一堆\x00
试验结束。
我的代码相关部分是为了读取文件内容,读取了再处理,处理完了再将结果写入文件,并覆盖以前的内容,代码相关流程简化如下:
with open(file,"r+") as f:
data = f.read()
#do something with data
f.truncate(0)
f.write(handled_data)
然后出现的问题就跟上面一样,因为read的时候已经将指针移到了末尾,此时truncate(0)了将文件内容清空了,但是文件指针还是在原来的位置,写的时候还是从那个位置开始,所以文件前面就会有一堆\x00
解决办法很简单:
with open(file,"r+") as f:
data = f.read()
#do something with data
f.seek(0)
f.truncate(0)
f.write(handled_data)
将文件指针放到最前面位置后,再写文件就是从开始位置写内容了
虽然这个问题比较简单,但是对我来说还是值得记录一下的,假如以后忘了还可以来看一下
本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!