[英]handling gzip.open or open in with statement
读入一批系统日志文件。 其中一些已被压缩:
syslog
syslog.1
syslog.2.gz
syslog.3.gz
syslog.4.gz
with open(args.filename_path, "rb") as file:
当扩展名为gz
时,在with
语句中使用 gzip.open 时,一切似乎都正常:
with gzip.open(args.filename_path, "rb") as file:
如何在gz
文件时获取gzip.open
,但在“普通”文件时使用open
。
一种方法是检查文件是否经过 gzip 压缩,如果是,则使用gzip.open
,否则使用open
。
import gzip
paths = ["foo.log", "bar.log.gz"]
def is_gzipped(path):
return path.endswith(".gz")
for path in paths:
open_fn = gzip.open if is_gzipped(path) else open
with open_fn(path) as f:
pass # do things with file
检查文件是否被 gzip 压缩的更好方法是查询“幻数”并查看它们是否与 gzip 匹配。 有关详细信息,请参阅https://stackoverflow.com/a/47080739/5666087 。
def is_gzipped(path):
with open(path, "rb") as f:
return f.read(2) == b'\x1f\x8b'
它应该运作良好。 这是一个例子:
在操作系统中:
cat test.txt
foo
bar
gzip test.txt
即使扩展名不是gz
:
在操作系统中:
mv test.txt.gz test.txt
在 Python: with gzip.open("test.txt") as f: print(f.read())
foo
bar
在 Python 中:
with gzip.open("test.txt.gz") as f:
print(f.read())
foo
bar
但是,如果文件不是gzip
压缩的,那么您将收到异常IOError: Not a gzipped file
。
标准模块文件输入的fileinput
()完全符合您的要求:
使用
gzip
和bz2
模块透明地打开使用gzip和bzip2压缩的文件(由扩展名.gz和.bz2识别)。 如果文件扩展名不是.gz或.bz2 ,则文件正常打开(即使用open()
无需任何解压缩)。
with fileinput.hook_compressed("test.txt.gz") as f:
f.read()
with fileinput.hook_compressed("test.txt") as f:
f.read()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.