在Python中解析大型的,可能是压缩的文件

时间:2017-08-21 13:37:22

标签: python python-2.7 gzip

我正在尝试逐行解析一个大文件以获取相关信息。 我可能正在接收未压缩或压缩文件(我可能需要在稍后阶段编辑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

有关如何处理此问题的任何建议? 我不想在代码块之外解压缩文件,因为这需要是通用的,我必须整理多个文件。

1 个答案:

答案 0 :(得分:5)

readlines完全读取文件。因此,对于大文件来说,这是不行的。

像你一样做2个上下文块,然后在它们之外使用input_file句柄不起作用(在关闭文件上操作)。

为了充分发挥这两个方面的作用,我会对上下文块使用三元条件(确定是否必须使用opengzip.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: