python的文件操作
文件操作的编码
文件的编码的方式在创建该文件的时候已经确立,我们要想正确的读取文件,就要使用和文件编码方式相同的方式来读取。
以utf-8存储的文件,在读取时是按照utf-8的标准去断句的,把段好的句交给python3翻译成Unicode的编码方式,这个翻译的原理就是那张Unicode与其他编码的转换表。在python3中内存中都是unicode的形式存储的。
python3中的open()函数的编码方式默认是utf-8
有两种方法来操作文件:
1.f = open(‘文件的路径或文件名’,‘模式,默认是r’,encoding=‘文件的编码方式,默认是和系统的编码方式一致’)
最后要记得f.close(),
2.with open() as f:
encoding=’默认的是gbk’,两者之间的差别还有方法1要强制关闭文件,方法2不需要
以方法2来讲解下面的模式
- 1.读操作:只能读不能写
1.1r模式
withopen('file_GBK',’r’,encoding=’gbk’) asf:
该模式可以读取文本文件,可以结合f.read(),for line in f:来读取文件内容,还有几个函数readline():读一行的内容遇到\r或\n结束
1.2rb模式
with open('file_GBK',’rb’) as f:
这种模式是没有编码方式的,它会把数据以二进制码bytes的形式读取到内存中,想要看内容要decode。这种模式可以读取多种文件,例如图片,音频等无法直接显示的文件。
- 2.写模式
2.1w模式:写模式会先删除内容再写入,原来的内容全删除。
with open('file_GBK',’w’,encoding=’gbk’) as f:
f.write(‘你好世界’)
2.2wb模式
with open('file_GBK',’wb’) as f:
f.write(‘你好世界’.encode(‘gbk’))
写入的内容一定是bytes的类型
3.a模式
withopen('file_GBK',’a’,encoding=’gbk’) asf:
withopen('file_GBK',’ab’,encoding=’gbk’) asf:
追加模式,读写模式的时候写的东西后光标停在后面了,这时无法读到前面的内容了。不管当前的位置在哪,a模式总是在文件的末尾添加,不受光标位置影响。
4.写读模式
with open('file_GBK',’w+’,encoding=’gbk’) as f:
即可写也可读,先进性写操作,会先将文件截取,然后写入后可以进行读操作。
5.读写模式
withopen('file_GBK',’r+’,encoding=’gbk’) asf:
读写模式是以读的模式打开文件,可读可写。
读写与写读的区别:读写不会删除之前的内容,但是写读的话会先执行写,支持后面写的可以读。一般推荐读写模式。
6.文件操作的其他函数
Flush()可以把内存里的内容直接写入到硬盘而不用等到文件关闭后再写入,强制刷入硬盘中。
truncate()从但前位置到最后截断truncate(x)x代表从开头开始的x个字节后开始截断
seek()定位以后写入是在这个位置上重写,并不会插入一些内容,这由硬盘的存储方式决定,
def tell(self, *args, **kwargs): # real signature unknown
</code><code>返回当前文件操作光标位置</code><code>
def seek(self, *args, **kwargs): # real signature unknown
</code><code>把操作文件的光标移到指定位置</code><code>
*</code><code>注意</code><code>seek</code><code>的长度是按字节算的,</code><code> </code><code>字符编码存每个字符所占的字节长度不一样。
read(1)读取的是一个字符,tell(),seek()都是一个一个字节的
使用tell()可以得知当前的位置,seek()则是想要到那个位置上去。注意两个函数都是按照字节来计算的,如果seek到汉字的几个字节的中间,读取的数据会乱码。
7.修改文件的方式
1.先读取到内存里,修改完后在重新输入到文件里,只限于小文件,要不然内存会撑爆。还有一个问题是要是修改后的文件所占的存储变小后多出来的空间使用truncate()截取掉保证存储时不存在无法识别的多余字节。使用的seek到开头,所以如果文件表小的时候就会出现三个字节里面被字母占了一个字节,导致编码显示错误,所以后面的内容要truncate一下。
2.读一行,写到一个新的文件中,写完后,删除原文件,新文件重命名为原文件名。
3,。类似于方法二,使用re模块,sb()正则替换后存在新的文件后,和方法二一致。
#Coding:utf-8
指定编译器以utf-8的编码方式去编码代码,是代码显示的时候不会出现乱码。
在python2中比较明显,里面的汉字以utf-8编码在环境是GBk编码的时候,CMD里面时就会出现乱码。
文件修改要注意的地方:
使用把所有的文件读到内存里的方式时,要是文件变小了,原来剩余的空间就会变成碎片,要是文件变大了,就会重新开辟空间来存储,文件指向新的存储空间。原空间则会变成可以利用的“空”的空间。使用的seek到开头,所以如果文件表小的时候就会出现三个字节里面被字母占了一个字节,导致编码显示错误,所以后面的内容要truncate一下。