python 写文件后度取出空字符、乱码 seek()方法

基础:

python 的 open(name[, mode[, buffering]]) 方法会返回文件对象File,用于文件操作。

mode参数解析:

‘r’——读取(默认值)

‘w’——写入(如果文件存在,截断改文件(清空))

‘a’——追加写入(对于类Unix系统,意味着所有写入都会追加到文件末尾,忽略seek()指针位置。)

‘*b’——*替换为r/w/a,表示以二进制形式读写文件。

‘*+’——*替换为r/w/a,以更新方式打开文件(同时读写)。‘w+’会截断(清空)文件,也可以加‘b’为读写二进制文件。

buffering:  0表示不缓冲,1表示行缓冲,其他正整数表示与之近似的缓冲大小值(以字节为单位);负值表示使用系统默认值。不写buffering表示使用系统默认值。

正文:

这里总结的是读写文件的指针问题,即seek()函数的功能。

首先读写文件,是有指针的。读一个字节,指针在字节末尾;一行,在行尾;读取整个文件,指针就在文件末尾(文件不大的情况)。

写程序的时候碰到了一个问题,读出整个文件后,清空文件从新写入。再读出时文件前端有许多空字符‘/x00’。

1 with open('/data/text.txt', 'r+') as f:
2     lines = f.readlines()
3     f.truncate(0)
4     context = f.writelines(lines)
5     print context

将读出的内容从新写回,出现了乱码问题。

原因分析:open()以r+模式开启了一个附加读写模式的文件,由于是r,读取后指针在文件末尾。此时做truncate(0),从文件开头进行截断,之后Python指针位置就是EOF,在EOF处开始写入,带入了空字符,再次读取时,会先到空字符串,然后才是写入内容。

解决办法是重置指针位置为0:seek(0)

1 with open('/data/text.txt', 'r+') as f:
2     lines = f.readlines()
3     seek(0)
4     f.truncate()
5     seek(0)
6     context = f.writelines(lines)
7     print context

这个文件读写指针真的很重要,一直忽略了它,真是不应该。

 

posted @ 2017-09-13 21:00  近海735  阅读(573)  评论(0编辑  收藏  举报