python文件操作
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError。使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法。
使用python的with语句
实现在处理文件时,无论是否抛出了异常,都能保证with语句执行完毕后关闭已打开的文件
with open(file, mode='r') as target:
with-body
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file: 必需,文件路径(相对或者绝对路径)。
mode: 可选,文件打开模式
buffering: 设置缓冲
encoding: 一般使用utf8
errors: 报错级别
newline: 区分换行符
closefd: 传入的file参数类型
opener:
mode模式参数值
以二进制形式打开文件
使用open函数不仅可以以文本的形式打开文件,而且可以以二进制形式打开非文本文件,如图片、音频、视频文件等
>>> file=open('test.txt','r')
>>> file
<_io.TextIOWrapper name='test.txt' mode='r' encoding='cp936'>
>>> file.read()
'123456789\n234567890\n345678901'
>>> file1=open('test.jpg','rb')
>>> file1
<_io.BufferedReader name='test.jpg'>
创建的是一个bufferreader对象。该对象生成后,可以再应用其他的第三方模块进行处理。
打开文件时指定编码方式
open函数打开文件时,默认采用GBK编码,当打开的文件不是GBK编码时,会抛出异常
通过添加encoding='编码方式'解决
>>> file = open('utf8.txt','r')
>>> file.read()
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
file.read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0xbf in position 2: illegal multibyte sequence
>>> file.close()
以utf-8编码打开
>>> file = open('utf8.txt','r',encoding='utf-8')
>>> print(file.read())
123
>>> file.close()
文件内容的读取
file.read([size])
从文件读取指定的字节数,如果未给定或为负则读取所有。
>>> with open('utf8.txt','r',encoding='utf-8') as f:
f.read()
'\ufeff123\n456\n789'
file.readline([size])
读取整行,包括 "\n" 字符。
>>> with open('utf8.txt','r',encoding='utf-8') as f:
f.readline()
'\ufeff123\n'
file.readlines([sizeint])
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
>>> with open('utf8.txt','r',encoding='utf-8') as f:
f.readlines()
['\ufeff123\n', '456\n', '789']
文件迭代器
>>> with open('utf8.txt','r',encoding='utf-8') as f:
for line in f:
print(line,end='')
123
456
789
总结
像read(),readlines()这种一次性全部读取的方式在大多数情况下并非良方
如果是一个大文件,它会占用大量内存,甚至可能会因为内存不足而读取失败。
但并非必须要选择for line in open('a.txt')的方式,因为有些时候必须加载整个文件才能进行后续的操作,比如要排序文件,必须要拥有文件的所有数据才能进行排序。而且对于小文件来说,一次性读取到一个列表中操作起来可能会更加方便,因为列表对象有很多好用的方法。所以,不能一概而论地选择for line in open('a.txt')。
读取出来的内容,都带行尾的换行符,可以使用字符串的strip()方法去除。
文件内容的写入
file.write(str)
将字符串写入文件,返回的是写入的字符长度。不会自动加入换行符
>>> with open('test.txt','w') as f:
f.write('line1')
f.write('line2'+'\n')
5
6
>>> with open('test.txt','r') as f:
f.read()
'line1line2\n'
file.writelines(sequence)
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
>>> data = ['line1','line2','line3']
>>> with open('test.txt','w') as f:
f.writelines(data)
>>> with open('test.txt','r') as f:
f.read()
'line1line2line3'