Python中是否有任何模块可以让我提取各种档案?我需要解压zip、tar.bz2、tar.z、rar等。现在看起来我必须手动进行存档类型检测,并且还要为每个单独的文件编写一个提取。
更喜欢纯Python。
Python中是否有任何模块可以让我提取各种档案?我需要解压zip、tar.bz2、tar.z、rar等。现在看起来我必须手动进行存档类型检测,并且还要为每个单独的文件编写一个提取。
更喜欢纯Python。
查看帕图尔。我无法证明它的工作情况如何,但还有一些基于它的其他模块,尽管它确实依赖于某些格式的外部应用程序。
patool 支持 7z (.7z), ACE (.ace), ADF (.adf), ALZIP (.alz), APE (.ape), AR (.a), ARC (.arc), ARJ (.arj), BZIP2 (.bz2)、CAB (.cab)、COMPRESS (.Z)、CPIO (.cpio)、DEB (.deb)、DMS (.dms)、FLAC (.flac)、GZIP (.gz)、LRZIP ( .lrz), LZH (.lha, .lzh), LZIP (.lz), LZMA (.lzma), LZOP (.lzo), RPM (.rpm), RAR (.rar), RZIP (.rz), SHN (.shn)、TAR (.tar)、XZ (.xz)、ZIP (.zip、.jar) 和 ZOO (.zoo) 格式。它依赖于帮助应用程序来处理这些存档格式(例如 bzip2 用于 BZIP2 存档)。
在标准库中,您已经有了模块zlib
、gzip
、bz2
和zipfile
来tarfile
处理压缩档案。
对于 rar 档案,pypi 上有一个 rarfile 模块,它具有与 zipfile 类似的接口,并适用于 python 2 和 3。
shutil
从 3.2 开始,它似乎添加了更多的归档功能,但目前只支持 gziptar、bztar、tar 和 zip。
您可以添加自己的处理程序shutil.register_archive_format()
- 这样您就不必手动检测扩展......但您仍然需要自己定义提取。
这个线程很旧,但我又遇到了这个问题。我已经尝试过 Patool 选项或 pyunpack(依赖于 Patool),但强烈建议不要使用基于 Patool 的选项并使用内置的 shutil 库,因为 Patool 似乎有一段时间不支持了。由于更改了库名称,我自己遇到了一个错误。
正如crennie回答的那样,我选择了高级内置 shutil 库,下面是我将 7z 和 rar 格式添加到 shutil 功能的代码,这是完整的初始问题。请注意,这需要p7zip-full
并且p7zip-rar
可以使用以下命令轻松设置pip install
:
def extractfiles(zipname, output_dir):
"""Extract files with 7z utils.
-aoa switch asks for automatic overwrite without prompting user.
"""
logging.info(f"Extracting {zipname} to {output_dir}")
pipe = Popen(["7z", "x", "-aoa", "-bd", zipname, f"-o{output_dir}"], stderr=STDOUT, stdout=PIPE)
return(pipe.communicate())
def register_extensions():
"""Register additionnal archive formats supported by 7zip in shutil."""
shutil.register_unpack_format('rar', ['.rar', '.RAR'], extractfiles)
shutil.register_unpack_format('7z', ['.7z', '.7Z'], extractfiles)