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

Python: open either zipped or unzipped file using "with"

我正在寻找使用 "with" 打开文件的解决方案。 Hoever,我想检查文件是否压缩,然后使用 gzip.open 或打开类似:

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

有什么想法吗?

您可以做到这一点的一种方法是制作自己的上下文管理器来为您完成。

from contextlib import contextmanager

@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 子句的优势,同时让您可以灵活地选择要调用的函数。

作为创建另一个上下文管理器的替代方法,您可以简单地在 with 语句中选择函数:

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

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

我喜欢 Shadow 的回答,更新后的版本对我很有效。这是一个稍微简化的版本,应该也可以使用:

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