繁体   English   中英

处理 gzip.open 或 open in with 语句

[英]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 ()完全符合您的要求:

使用gzipbz2模块透明地打开使用gzipbzip2压缩的文件(由扩展名.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM