Python:使用"打开压缩文件或解压缩文件,使用"

时间:2017-12-05 00:00:43

标签: python with-statement

我正在寻找使用"和#34;打开文件的解决方案。不过,我想检查文件是否被gzip压缩,然后使用gzip.open或只是打开类似的东西:

if f.endswith(".gz"):
    with gzip.open() as f:
else:
    with open() as f:
for line in f:

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

作为创建另一个上下文管理器的替代方法,您只需在with语句中选择该函数:

with (gzip.open if filename.endswith(".gz") else open)(filename) as f:
    for line in f:
        ...

(虽然知道以.gz结尾并不一定使文件成为gzip文件。)

答案 1 :(得分:1)

您可以通过制作自己的上下文管理器来为您完成此任务。

from contextlib import contextmanager
def open_file(filename):
    if filename.endswith(".gz"):
        with gzip.open(filename) as f:
            yield f
    else:
        with open(filename) as f:
            yield f

然后你可以用它来打开文件。

with open_file("filename") as f:
    # f will be either the result of `gzip.open` or `open`, depending on its filename.
    for line in f:
        pass  

这使您能够保持使用with子句的优势,同时让您可以灵活地选择要调用的函数。

答案 2 :(得分:0)

我喜欢Shadow的答案,并且更新的版本对我有用。这是一个略微简化的版本,也应该可以使用:

def open_smart(filename, mode = "r"):
    if filename.endswith(".gz"):
        return(gzip.open(filename, mode))
    else:
        return(open(filename, mode))