基础:
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
这个文件读写指针真的很重要,一直忽略了它,真是不应该。