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的时候:
size不为0,但小于filesize的时候:
可以看到,文件内容后面有一堆\x00
试验结束。
我的代码相关部分是为了读取文件内容,读取了再处理,处理完了再将结果写入文件,并覆盖以前的内容,代码相关流程简化如下:
解决办法很简单:
将文件指针放到最前面位置后,再写文件就是从开始位置写内容了
虽然这个问题比较简单,但是对我来说还是值得记录一下的,假如以后忘了还可以来看一下
本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!
先来看看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)
将文件指针放到最前面位置后,再写文件就是从开始位置写内容了
虽然这个问题比较简单,但是对我来说还是值得记录一下的,假如以后忘了还可以来看一下
本人出于个人兴趣,创建了一个个人公众号,每天筛选国外网友发现的有趣的事情推送到公众号,欢迎关注!
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- Python动态类型的学习---引用的理解
- Python3写爬虫(四)多线程实现数据爬取
- 垃圾邮件过滤器 python简单实现
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 下载并遍历 names.txt 文件,输出长度最长的回文人名。
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap