Python 文件读写笔记整理
参数说明
open(path, flag[, encoding][,errors])
path:要打开文件的路径
flag:打开方式
encoding:编码方式
errors:错误处理
Flag打开方式表
模式 | 描述 |
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
打开文件
设置测试文件
创建一个test.txt文件,并在其中输入一些内容。
如下:
打开文件示例
使用r(只读方式)打开test.txt,设置打开编码格式为utf-8。
示例如下:
# 设置文件路径
path = 'test.txt'
f = open(path, 'r', encoding='utf-8')
读取忽略错误
可通过设置errors=’ignore’来忽略读取的错误。
示例如下:
# errors=ignore 忽略错误
f = open(path, 'r', encoding='utf-8', errors='ignore')
读取文件
读取全部内容
使用文件的read()方法,可用于读取文件中所有内容。
示例如下:
f = open(path, 'r', encoding='utf-8')
print(f.read())
# 执行结果
# 及至始皇,奋六世之余烈,振长策而御宇内,吞二周而亡诸侯,履至尊而制六合,执敲扑而鞭笞天下,威振四海。
# 南取百越之地,以为桂林、象郡;百越之君,俯首系颈,委命下吏。
# 乃使蒙恬北筑长城而守藩篱,却匈奴七百余里。
# 胡人不敢南下而牧马,士不敢弯弓而报怨。
忽略错误应用
当出现因为读取文件编码格式产生错误时,可使用errors=ignore来忽略报错,继续读取。
示例如下:
f = open(path, 'r', encoding='gbk')
print(f.read())
因为编码文件为utf-8格式,但使用gbk时会抛出错误:
Traceback (most recent call last):
File "E:\lianxipy\day3\文件读写.py", line 17, in <module>
print(f.read())
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 2: illegal multibyte sequence
使用忽略错误
示例如下:
f = open(path, 'r', encoding='gbk', errors='ignore')
print(f.read())
# 执行结果
# 銆銆鍙婅嚦濮嬬殗锛屽嬪叚涓栦箣浣欑儓锛屾尟闀跨瓥鑰屽尽瀹囧唴锛屽悶浜屽懆鑰屼骸璇镐警锛屽饱鑷冲皧鑰屽埗鍏鍚堬紝鎵ф暡鎵戣岄灜绗炲ぉ涓嬶紝濞佹尟鍥涙捣銆
# 鍗楀彇鐧捐秺涔嬪湴锛屼互涓烘傛灄銆佽薄閮★紱鐧捐秺涔嬪悰锛屼刊棣栫郴棰堬紝濮斿懡涓嬪悘銆
# 涔冧娇钂欐伂鍖楃瓚闀垮煄鑰屽畧钘╃憋紝鍗村寛濂翠竷鐧句綑閲屻
# 鑳′汉涓嶆暍鍗椾笅鑰岀墽椹锛屽+涓嶆暍寮寮撹屾姤鎬ㄣ
因为编码格式的问题,虽然也能读取出来但都是乱码。
读取整行
读取整行,包括“\n”字符。
示例如下:
print(f.readline())
# 执行结果
# 及至始皇,奋六世之余烈,振长策而御宇内,吞二周而亡诸侯,履至尊而制六合,执敲扑而鞭笞天下,威振四海。
读取指定字符数
可使用文件的read(num)或readline(num)方法中传递num参数来获取指定字符数。
示例如下:
print(f.read(6))
# 执行结果
# 及至始皇 # 测试文件开头处有两个空格
print(f.readline(6))
# 执行结果
# ,奋六世之余
读取所有行
读取所有行,并返回列表。
示例如下:
print(f.readlines())
# 执行结果
# ['\u3000\u3000及至始皇,奋六世之余烈,振长策而御宇内,吞二周而亡诸侯,履至尊而制六合,执敲扑而鞭笞天下,威振四海。\n',
# '南取百越之地,以为桂林、象郡;百越之君,俯首系颈,委命下吏。\n',
# '乃使蒙恬北筑长城而守藩篱,却匈奴七百余里。\n',
# '胡人不敢南下而牧马,士不敢弯弓而报怨。']
若给定的数字大于0,返回实际size字节行数。
示例如下:
print(f.readlines(60))
# 执行结果
# ['\u3000\u3000及至始皇,奋六世之余烈,振长策而御宇内,吞二周而亡诸侯,履至尊而制六合,执敲扑而鞭笞天下,威振四海。\n', '南取百越之地,以为桂林、象郡;百越之君,俯首系颈,委命下吏。\n']
设置文件当前位置
使用file.seek(offset) 设置文件读取的当前位置。
示例如下:
print(f.read(3))
print(f.read(3))
# 设置读取当前位置回到开始位置
f.seek(0)
print(f.read(3))
# 执行结果
# 及
# 至始皇
# 及
关闭文件
file.close() 关闭文件。关闭后文件不能再进行读写操作。
示例如下:
print(f.read())
f.close()
# 关闭文件后在读取文件
print(f.read())
执行结果:
及至始皇,奋六世之余烈,振长策而御宇内,吞二周而亡诸侯,履至尊而制六合,执敲扑而鞭笞天下,威振四海。
南取百越之地,以为桂林、象郡;百越之君,俯首系颈,委命下吏。
乃使蒙恬北筑长城而守藩篱,却匈奴七百余里。
胡人不敢南下而牧马,士不敢弯弓而报怨。
Traceback (most recent call last):
File "E:\lianxipy\day3\文件读写.py", line 71, in <module>
print(f.read())
ValueError: I/O operation on closed file.
写入文件
字符串写入
file.write(str) 将字符串写入文件,返回的是写入的字符长度。
示例如下:
path = 'test.txt'
f = open(path, 'a+', encoding='utf-8')
print(f.write("过秦论\n"))
# 文件内容会首先写入缓冲区 等需要关闭后 内容才会写入文件
f.close()
序列字符串写入
file.writelines(sequence) 向文件写入一个序列字符串列表。
如果需要换行则要自己加入每行的换行符。
示例如下:
path = 'test.txt'
f = open(path, 'a+', encoding='utf-8')
sequence = ["过\n", "秦\n", "论\n"]
print(f.writelines(sequence))
# 文件内容会首先写入缓冲区 等需要关闭后 内容才会写入文件
f.close()
文件写入缓冲区验证
使用休眠程序来演示不关闭程序时,内容只是写入缓冲区,而不是写入文件。
示例如下:
path = 'test.txt'
f = open(path, 'w', encoding='utf-8')
f.write('张三有两个哥哥')
# 使用休眠程序 来演示不关闭程序时 内容不会写入文件
num = 1
while num < 10:
time.sleep(1)
num += 1
print(num)
continue
f.close()
可通过查看test.txt发现在10秒后,while循环退出后才写入到文件中,内容之前一直存在缓冲区。
刷新缓冲区
内容写入文件的三种原因:
1.文件关闭
2.缓冲区空间装满了,自动刷新
3.刷新缓冲区
下面试一下主动刷新缓冲区。
示例如下:
path = 'test.txt'
f = open(path, 'w', encoding='utf-8')
f.write("--- START --- \n")
num = 1
while num < 10:
time.sleep(1)
num += 1
# 刷新缓冲区
f.flush()
f.write("这是刷新缓冲区 %d \n" % num)
print(num)
continue
f.write("--- END -- \n")
f.close()
效果:
可查看到休眠程序并没有影响到文件的每秒写入内容。
文件读写完整过程
一个文件读写完整过程:
设置路径、读写方式、编码方式及忽略错误。
还需要把对文件的操作进行防止异常处理,文件打开后正常操作结束后需要关闭文件,但有些错误还是会抛出,无法向下执行关闭处理;所以需要异常处理的finally无论是否报错都要执行关闭文件。
示例如下:
path = 'test.txt'
# 打开文件
f = open(path, 'r+', encoding='utf-8', errors='ignore')
try:
# 对文件进行读写操作
print(f.read())
print(f.write('过秦论'))
finally:
# 关闭文件
f.close()
优化
优化为使用with open() as打开文件,
这些try-finally已经封装到操作中。
如果出现异常后会直接关闭文件,不会丢失之前写入的内容;
且只使用一行就可以处理。
示例如下:
path = 'test.txt'
with open(path, 'r+', encoding='utf-8', errors='ignore') as f:
print(f.read())
print(f.write('过秦论'))
总结
主要是python 文件读写的方法、参数、整体过程及其示例的笔记整理。