Python对文件的操作
文件操作
文件对象操作
open()
函数用于打开文件对象,open(file,mode)
file必需,文件路径,mode可选,文件打开模式。
有 r、rb、r+、rb+、w、wb、wb、w+、wb+、a、ab、a+、ab+
Python在处理文本对象时可采取字节模式和字符模式
文件对象像序列一样可遍历,因此程序完全可以使用for循环来遍历文件内容。也可使用list(fp)
方法或fp.readlines()
方法将文件内容存放到列表中。
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的清理操作,释放资源。比如文件使用后自动关闭、线程锁的自动获取和释放等。1
2
3with open(r'd:/abc.txt') as fp:
for line in fp:
print(line)
文件对象的字节模式/b模式
(UTF-8编码为例)
文件对象 | 读操作 | 写操作 | 指针操作 |
---|---|---|---|
ASCII字节 | 返回bytes/字节类型的ASCII | 写入bytes类型字节 例如:b”This is ASCII” |
使用seek每次设置任意字节 |
中文字符串 | 返回bytes/字节类型的乱码 例如:\xe4\xbd\xa0,三组为一个中文,需解码显示 例如:’\xe4\xbd\xa0\’.decode(‘utf8’) |
把字符串编码后才可写操作 例如:’内容’.encode(‘utf-8’) |
使用seek每次设置3的倍数的字节 |
文本对象的字本模式
文件对象 | 读操作 | 写操作 | 指针操作 |
---|---|---|---|
ASCII字节 | 返回可查看的字符串 | 写入字符串 | 使用seek每次设置任意字节 |
中文字符串 | 返回可查看的字符串 | 写入字符串 | 使用seek每次设置3的倍数的字节 |
文件对象的主要方法
1 | 读 |
mode参数 | 含义描述 |
---|---|
r | 只读 |
rb | 只读 |
r+ | 只读,二进制格式 |
rb+ | 读写,二进制格式 |
w | 写,文件不存在则新建,存在则删除原有内容 |
wb | 写,二进制格式,文件不存在则新建,存在则删除原有内容 |
w+ | 读写,文件不存在则新建,存在则删除原有内容 |
wb+ | 读写,二进制格式,文件不存在则新建,存在则删除原有内容 |
a | 追加,文件不存在则新建,存在则追加内容 |
ab | 追加,二进制格式,文件不存在则新建,存在则追加内容 |
a+ | 读写,文件不存在则新建,存在则追加内容 |
ab+ | 读写,二进制格式,文件不存在则新建,存在则追加内容 |
open()的详细格式为:
open(file, mode="r", buffering=None, encoding=None, errors=None, newline=None, closefd=True, opener=None)
参数说明:
file:必需,文件路径(相对或绝对路径)
mode:可选,文件打开模式
buffering:设置缓冲
encoding:一般使用utf-8
errors:报错级别
newline:区分换行符
closefd:传入的file参数类型
opener:可以通过调用 opener方式,使用自定义的开启器。底层文件描述符是通过调用opener或者file、flags获得的。opener必须返回一个打开的文件描述。将os.open作为opener的结果,在功能上,类似于通过None。
读CSV文件
要读取CSV文件,首先需要导入Python的CSV模块:
import csv
由于CSV文件本质上是一个文本文件,所以需要先以文本文件的方式打开,再将文件对象传递给CSV模块:
1 | import csv |
for循环得到的row是OrderedDict(有序字典),可以直接像普通字典那样使用
特别注意:读取文本内容的代码必须放在缩进内部进行,否则会导致报错。
这是因为f变量里面的值是一个生成器,生成器只有在被使用(更准确的说法是被迭代)的时候才会去读文本内容。但是退出with的缩进以后,文件就被Python关闭了,这个时候当然什么都读不了
列表推导式可以绕过这个限制
1 | import csv |
写CSV文件
Python可以把一个字典写成CSV文件,或者把一个包含字典的列表写成CSV文件。
Python写CSV文件比读CSV文件稍微复杂一点,因为要指定列名。
列名要和字典的Key一一对应。
Python写CSV文件时需要用到csv.DictWriter()这个类。它接收两个参数:
第1个参数是文件对象f;第2个参数名为fieldnames,值为字典的Key列表。
写入CSV文件的为列名的一行:
writer.writeheader()
将包含字典的列表全部写入到CSV文件中:
writer.writerows(包含字典的列表)
学入单个字典:
writer.writerow(字典)