Python 文件读写与编码解读
一、Python 读取文件使用open函数
python open() 函数用于打开一个文件,创建一个 file 对象,相关的方法才可以调用它进行读写。
open(name[, mode[, buffering]])
参数说明:
-
name : 一个包含了你要访问的文件名称的字符串值。
-
mode : mode 决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
-
buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
二、python的open()方法用来打开一个文件。第一个参数时文件的位置和文件名,第二个为可选参数,指定打开读写的模式。
例子:f=open(‘1.txt’,'w')
使用open()打开文件后一定要记得关闭文件对象,
f.close()
可以用try()finally()确定关闭文件。
file=open()
try:
atxt=file.read()
finally:
file.close()
注:不能把open语句放到try块里面,因为打开文件出现异常时,文件对象无法close()
三、.读取方法:
read(【size】)
readline([size])
readlines([size])//读取缓存块大小的文件内容,可以用import io io.default.buffer.size查看缓存块的大小
iter()方法//并没有吧文件内容全部导入内存,而是在next读取的时候才读入内存
f.readline()读取文件一行的内容
f.readlines()读取所有的行到数组里面[line1,line2,…lineN]列表
在避免将所有文件内容加载到内存中,这种方法常常使用,便于提高效率。
四、注意问题 Python 读取文件乱码结局方案:
方案1:
字符编码参考http://www.cnblogs.com/xinghaiyige/p/7381518.html
文件读取编码方案:
1、查看文件编码方式
引入识别编码模块chardet,没有安装简单使用pip install chardet
import chardet files = open('11.txt','r').read() print chardet.detect(files) print files.decode('UTF-8-SIG').encode('utf-8') #ANSI 编码代表 GBK
结果:
{'confidence': 1.0, 'language': '', 'encoding': 'UTF-8-SIG'}
dddd dddddddddd d
中国人民共和国
通过看结果编码,对txt文本进行decode解码,成unicode ,然后编码为utf-8
解决方案2:
文件直接读取
其中,关于open的编码解释如下:
读取时:内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。
编码时:模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。
所以可以在读取的时候指定编码,这样可以避免很多问题,如下:
# coding: GBK import codecs f= codecs.open('test.txt', encoding='UTF-8')
#f = codecs.open('test.txt',encoding = 'UTF-8','IGNORE') u= f.read() f.close() print type(u)# <type 'unicode'> f= codecs.open('test.txt','a', encoding='UTF-8') # 写入unicode f.write(u) # 写入str,自动进行解码编码操作 # GBK编码的str s= '汉' print repr(s)# '\xba\xba' # 这里会先将GBK编码的str解码为unicode再编码为UTF-8写入 f.write(s) f.close()
四、写入文件的问题
写入文件时,执行write()后内容不会马上写入文件,要用f.close()或者f.flush()命令,才会写入。
或者当写入的内容的大小大于缓存块的大小时,系统会自动将缓存块中的内容刷入文件,然后再继续相缓存中写入内容。(所以当文件足够大时系统也不一定会自动把所有内容都写入文件)
3.文件的指针:
当新建的文件时,指针指在文件的开始处,从0开始,当写入或读取内容时,文件的指针从0位置向后移动,当再次读取时,从指针的位置开始读取。因此当向文件写入内容后,要关闭文件再读取才会看到文件中有内容。
要让文件中的指针回到某个位置可以用命令f.seek(偏移量,参数)参数包括os.SEEK.CUR os.SEEK.END os.SEEK.SET
查看文件的指针所在位置的命令f.tell()