杨记

碎片化学习令人焦虑,系统化学习使人进步

0%

Python文件操作

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
3
with 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22


fp.read(size) size可选,读取文件中size个字符的内容,若size为负或不存在,读取全部内容;当文件大小是当前机器内容的两倍是,出错;若到了文件末尾,会显示空字符串

fp.readline() 读取文件中单独一行。返回的每行结尾会自动夹换行符'\n',如果到了文件末尾,返回空字符串

fp.readlines() 返回文件的所有行



fp.write(string) 将string写入文件中,返回值为写入的字符数

其他方法

fp.tell() 返回指针在文件中的位置,从文件开头开始计算的字符数

fp.seek(offset, from_what) 改变指针在文件中的位置,from_what=0120:文件开头 1:当前位置 2:文件结尾
seek(x,0) 从文件首字符移动x个字符
seek(x,1) 从当前位置往后移动x个字符
seek(-x,2) 从文件的结尾往前移动x个字符

fp.close() 关闭文件
mode参数 含义描述
r 只读
rb 只读
r+ 只读,二进制格式
rb+ 读写,二进制格式
w 写,文件不存在则新建,存在则删除原有内容
wb 写,二进制格式,文件不存在则新建,存在则删除原有内容
w+ 读写,文件不存在则新建,存在则删除原有内容
wb+ 读写,二进制格式,文件不存在则新建,存在则删除原有内容
a 追加,文件不存在则新建,存在则追加内容
ab 追加,二进制格式,文件不存在则新建,存在则追加内容
a+ 读写,文件不存在则新建,存在则追加内容
ab+ 读写,二进制格式,文件不存在则新建,存在则追加内容
总结:r模式和w模式,打开文件,指针都在文件头,而a模式则在文件尾;w模式和a模式都能在文件不存在时新建文件

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或者fileflags获得的。opener必须返回一个打开的文件描述。将os.open作为opener的结果,在功能上,类似于通过None。

读CSV文件

要读取CSV文件,首先需要导入Python的CSV模块:

import csv

由于CSV文件本质上是一个文本文件,所以需要先以文本文件的方式打开,再将文件对象传递给CSV模块:

1
2
3
4
5
import csv
with open('course.csv',encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
print(row)

for循环得到的row是OrderedDict(有序字典),可以直接像普通字典那样使用

特别注意:

读取文本内容的代码必须放在缩进内部进行,否则会导致报错。

这是因为f变量里面的值是一个生成器,生成器只有在被使用(更准确的说法是被迭代)的时候才会去读文本内容。但是退出with的缩进以后,文件就被Python关闭了,这个时候当然什么都读不了

列表推导式可以绕过这个限制

1
2
3
4
5
import csv
with open('course.csv',encoding='utf-8') as f:
reader = [x for x in csv.DictReader(f)]
for row in reader:
print(row)

写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(字典)

欢迎关注我的其它发布渠道