读文件:
- f.read(size) 默认读取整个文件,放进内存中,如果给size穿一个大小,则读size个字节
- f.readline() 读取一行,一行一行地读
- f.readlines() 读取整个文件,封装成一个列表中,占用空间
模式:
- r、w、a 只读、只写、文末追加
- rb、wb、ab 以二进制的方式
- r+、w+、a+ 可读可写模式,
- rb+、wb+、ab + 以二进制的方式+读写模式
r、r+:如果没有改文件,则报错FileNotFoundError,写的时候回覆盖原数据,打开的时候光标去到最前的位置 w、w+:如果没有改文件,自动创建文件,写的时候会覆盖原数据 a、a+:如果没有改文件,自动创建文件,写的时候会在文件最后追加,打开的时候光标去到最后的位置
# 1. 使用 f.read()
with open("a", "r+", encoding="utf8") as f:
file = f.read()
print(file)
# 2. 使用 f.readline()
with open("a", "r+", encoding="utf8") as f:
line = f.readline()
while line:
print(line.replace("\n", ""))
line = f.readline()
# 3. 使用 f.readlines()
with open("a", "r+", encoding="utf8") as f:
for line in f.readlines():
print(line.replace("\n", ""))
# 输出:
# first line
# second line
# third line
但是,使用生成器和迭代器的方法更加节省内存,通常在读大文件的时候使用
# 使用生成器(大文件,节省内存)
def get_line_generator(filepath, block_size=1024*1024):
file = open(filepath)
wile True:
chunk = file.read(block_size)
if not chunk:
break
yield chunk
for line in get_line_generator("a"):
print(line)
# 使用迭代器
with open(file, "r+", encoding="utf8") as f:
for line in f:
print(line, end="")
使用with这种标准的读取文件方式的好处有:
1、with上下文管理器自动关闭打开的文件
2、在迭代文件对象时,是一行一行地读取数据的,不会占用太大的内存
但是,如果存在一个10G的大文件,而且只有一行数据,那么使用with这种标准方式是行不通的。可以使用生成器的那种方式,每次读取指定大小的文件。