当文件过大时,将整个文件读取并处理会导致内存爆炸。因此在处理大文件时,需要一行一行地处理,这样可以在占用比较小的内存情况下完成数据处理。以下是实现读取大文件并逐行写入另外一个文件的攻略:
1. 打开文件
首先需要打开待读取的大文件和待写入的文件,使用open()
函数即可打开文件,常用参数有文件名、打开模式。对于大文件来说,还需要设置缓冲区大小参数,即buffering
大小,否则可能会发生内存溢出。
# 打开大文件
with open('big_file.txt', 'r', buffering=1024 * 1024) as f:
# 打开写入文件
with open('target_file.txt', 'w') as target_file:
# 逐行读取文件并写入
for line in f:
target_file.write(line)
上述代码使用了with
语句,它可以自动关闭文件,不需要在代码中显式调用f.close()
或 target_file.close()
。
buffering
参数设置为1024 * 1024,表示设置缓冲区大小为1MB。
2. 一次性读取大文件并逐行写入
如果不想用逐行读取的方式,也可以一次性读取全部数据到内存,再进行逐行写入。但是这样会占用更大的内存。代码如下:
with open('big_file.txt', 'r') as f:
# 一次性读取全部数据
lines = f.readlines()
with open('target_file.txt', 'w') as target_file:
for line in lines:
target_file.write(line)
上述代码使用了readlines()
函数一次性读取整个文件,存储在一个列表中,然后逐行写入target_file
。
示例1:过滤出以特定字符开头的行并写入文件
with open('big_file.txt', 'r') as f:
# 一次性读取全部数据
lines = f.readlines()
with open('target_file.txt', 'w') as target_file:
for line in lines:
# 过滤出以'#'开头的行并写入target_file
if line.startswith('#'):
target_file.write(line)
上述代码过滤出了原文件中所有以#
开头的行并写入target_file
。
示例2:将大文件拆分成小文件
def split_file(file_path, size=1024 * 1024):
# 读取文件并按照指定大小进行文件切割
with open(file_path, 'rb') as f:
chunk_size = size
file_num = 0
while True:
chunk = f.read(chunk_size)
if not chunk:
break
file_num += 1
with open(f'{file_path}_part_{file_num}', 'wb') as target_file:
target_file.write(chunk)
上述代码定义了split_file
函数,读取指定文件,并将文件按照指定大小进行切割,每个切割后的小文件命名规则为原文件名_part_编号
。分割文件大小可以通过size
参数进行设置,默认为1MB。
以上就是实现读取大文件并逐行写入另外一个文件的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现读取大文件并逐行写入另外一个文件 - Python技术站