您的位置:首页 > 编程语言 > Python开发

truncate file python

2016-04-12 20:27 369 查看
今天写代码读写文件发现文件内容出现'\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)


将文件指针放到最前面位置后,再写文件就是从开始位置写内容了

虽然这个问题比较简单,但是对我来说还是值得记录一下的,假如以后忘了还可以来看一下

本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息