CloudXli 2020-01-17
记得刚开始学习python文件操作写文件的时候有个问题,很奇怪。最后知道了就是字节数的原因。
我们先来看个例子。
新建个文件存为utf-8命名为0117utf-8.txt记得去掉BOM头。
我们用r+模式尝试去修改
>>> fp=open("d:\\pydelete\\0117utf-8.txt","r+")
>>> fp.write("aa")
2
>>> fp.close()
>>>
结果如下
乱码一大坨。
这里就涉及了字节数了。
因为utf-8存中文是用3个字节存一个,存英文是用1个字节存一个英文字符。
如果写入“aaa”就可以了。
所以切入正题,看看字节数和字符个数。
1.fp.read(arg),fp.write()后返回的数字是字符个数。
我们用刚才写过的文件读一下看看。
>>> fp=open("d:\\pydelete\\0117utf-8.txt","r+",encoding="utf-8")
>>> fp.read(1)
‘a‘
>>> fp.read(1)
‘a‘
>>> fp.read(1)
‘a‘
>>> fp.read(1) #可以看到这里的数字应该是字符个数,意思一个字符。
‘国‘
>>> fp.read(1)
‘话‘
>>> fp.read(1)
‘‘
>>>
我们再来写入一些内容。
>>> fp.seek(0.0) #将游标切回行首
0.0
>>> fp.write("新写入2x")
5 #可以看到这里也是字符个数。表示写入5个字符。
>>>fp.flush()
我们算一个结果之前文件内容是“aaa国话”我们写入“新写入2x” 之前的文件字节数是9,现在写入11 r+模式会从头开始覆盖所以现在文件内容为“新写入2x”
如果写入的字节数小于之前的有可能出现乱码(如果原文件有中文存在)
2.fp.tell(),fp.seek(0,0) 是字节数
我们加游标切回行首,再来读下。
>>> fp.seek(0,0)
0
>>> fp.read(1)
‘新‘
>>> fp.tell()
3 #可以看出tell是返回的字节数,也就是游标现在应该在新字后边。
>>>
由此我们试着改变游标位置。
>>> fp.seek(0,0)
0
>>> fp.seek(6,0) #seek的第一个参数也是字节数,那现在游标在哪我如果读一个字符应该是什么? 游标应该在写字后如果读一个字符应该是“入”
6
----------
>>> fp.read(1)
‘入‘
3.fp.truncate(size)
把文件裁成规定的大小,默认是裁到当前文件操作标记的位置。如果size 比文件的大小还要,依据系统的不同可能是不改变文件,
也能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。参数也是字节数。
我们来尝试一下
>>> fp.seek(0,0)
0
>>> fp.truncate(6)
6
>>>
此时文件内容应该只剩下“新写”2字。
知道这些我们在写文件的时候,就能很清楚效果了。
关于字节数可以参考: