我正在寻找使用"和#34;打开文件的解决方案。不过,我想检查文件是否被gzip压缩,然后使用gzip.open或只是打开类似的东西:
if f.endswith(".gz"):
with gzip.open() as f:
else:
with open() as f:
for line in f:
有什么想法吗?
答案 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))