流的透明解压
Transparent decompression of stream
如何读取 Python 中可能经过 gzip 压缩或未经过 gzip 压缩的文件?
我当前的代码
with gzip.open("file.xml") as f:
xml.sax.parse(f, reader)
适用于 .xml.gz
个文件,但不适用于 .xml
个文件:
...
File "/usr/lib/python3.5/gzip.py", line 409, in _read_gzip_header
raise OSError('Not a gzipped file (%r)' % magic)
是否有内置或可移植替代gzip.open()
总是returns的调用基于文件内容的未压缩流 and/or 文件扩展名?
related question 的答案可以解决我的问题,但我正在寻找不涉及任何额外代码的打包解决方案。
只需将此answer中定义的函数用于相关问题:
import gzip
def opener(filename):
f = open(filename, 'rb')
if f.read(2) == '\x1f\x8b':
f.seek(0)
return gzip.GzipFile(fileobj=f)
else:
f.seek(0)
return f
您还可以扩展它以支持其他文件格式。
如何读取 Python 中可能经过 gzip 压缩或未经过 gzip 压缩的文件?
我当前的代码
with gzip.open("file.xml") as f:
xml.sax.parse(f, reader)
适用于 .xml.gz
个文件,但不适用于 .xml
个文件:
...
File "/usr/lib/python3.5/gzip.py", line 409, in _read_gzip_header
raise OSError('Not a gzipped file (%r)' % magic)
是否有内置或可移植替代gzip.open()
总是returns的调用基于文件内容的未压缩流 and/or 文件扩展名?
related question 的答案可以解决我的问题,但我正在寻找不涉及任何额外代码的打包解决方案。
只需将此answer中定义的函数用于相关问题:
import gzip
def opener(filename):
f = open(filename, 'rb')
if f.read(2) == '\x1f\x8b':
f.seek(0)
return gzip.GzipFile(fileobj=f)
else:
f.seek(0)
return f
您还可以扩展它以支持其他文件格式。