记得刚开始学习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字。


知道这些我们在写文件的时候,就能很清楚效果了。