xopen这个Python模块提供了一个xopen函数,它的工作方式类似于内置的open函数,而且可以透明地处理压缩文件。支持的压缩格式目前是gzip, bzip2, xz和可选的Zstandard。
Xopen选择最有效的方法来读取或写入压缩文件。对于gzip文件,如果支持的话,使用python-isal库的线程方法。另外,还可以打开管道,使用外部工具,例如pigz,它是gzip的并行版本。
如果将threads=0传递给xopen(),则不使用外部进程。对于gzip文件,如果安装了python-isal(绑定isa-l),就会使用它(因为python-isal是xopen的依赖,所以应该总是这样)。Python -isal不支持大于3的压缩级别,因此如果没有可用的外部工具或线程设置为0,则使用Python内置的gzip。使用Open。
对于xz文件,使用到xz程序的管道,因为它内置了对多线程压缩的支持。
对于bz2文件,使用pbzip2(并行bzip2)。
如果其他方法都不能使用,xopen将返回到Python的内置函数(gzip.open, lzma.open, bz2.open)。
如果可以识别扩展名(.gz、。bz2、。xz或。zst),则使用的文件格式由文件名决定。在读取没有识别的文件扩展名的文件时,xopen试图通过读取文件的前几个字节来检测格式。xopen兼容Python 3.8及更高版本。
# Open a file for reading:
from xopen import xopen
with xopen("file.txt.gz") as f:
content = f.read()
#Write to a file in binary mode, set the compression level and avoid using an external process:
from xopen import xopen
with xopen("file.txt.xz", mode="wb", threads=0, compresslevel=3) as f:
f.write(b"Hello")
最新版的xopen使用 isal.igzip_threaded 模块,而不是利用管道从外部程序获取数据。这使得使用线程读写gzip文件更加高效。