我正在尝试逐行解析一个大文件以获取相关信息。 我可能正在接收未压缩或压缩文件(我可能需要在稍后阶段编辑zip文件)。
我正在使用以下代码,但我觉得,因为我不在with
语句中,我没有逐行解析文件,实际上是将整个文件file_content
加载到存储器中。
if ".gz" in FILE_LIST['INPUT_FILE']:
with gzip.open(FILE_LIST['INPUT_FILE']) as input_file:
file_content = input_file.readlines()
else:
with open(FILE_LIST['INPUT_FILE']) as input_file:
file_content = input_file.readlines()
for line in file_content:
# do stuff
有关如何处理此问题的任何建议? 我不想在代码块之外解压缩文件,因为这需要是通用的,我必须整理多个文件。
答案 0 :(得分:5)
readlines
完全读取文件。因此,对于大文件来说,这是不行的。
像你一样做2个上下文块,然后在它们之外使用input_file
句柄不起作用(在关闭文件上操作)。
为了充分发挥这两个方面的作用,我会对上下文块使用三元条件(确定是否必须使用open
或gzip.open
),然后迭代这些行。
open_function = gzip.open if ".gz" in FILE_LIST['INPUT_FILE'] else open
with open_function(FILE_LIST['INPUT_FILE'],"r") as input_file:
for line in input_file:
请注意我添加了" r"模式,以确保处理不在二进制文件上的文本(gzip.open
默认为二进制)
备选方案:open_function
可以是通用的,因此它不依赖FILE_LIST['INPUT_FILE']
:
open_function = lambda f: gzip.open(f,"r") if ".gz" in f else open(f)
一旦定义,您可以随意重复使用
with open_function(FILE_LIST['INPUT_FILE']) as input_file:
for line in input_file: