近期在做日志分析功能,需要解压大量的文件,文件的情况比较复杂,包括大文件,文件类型多,压缩文件中含压缩文件。使用python在linux平台解压文件的方法比较多,下面一一介绍:
1.方案1,使用python的库(含三方库)直接解压
2.方案2,调用linux的命令行解压,这里包括两种,一种是一般linux都存在的命令,如unzip命令,tar命令,另一种需要linux额外安装的程序,如rar压缩文件,需要额外安装rar程序,这种方案可以认为是方案1的补充,因为这种方案并不pythonic,跨平台移植能力太差,不同操作系统,需要不同的命令。
下面简述方案1:
最简式:
shutil模块自带一个压缩和解压缩功能,并且解压缩可自动匹配对应的压缩文件格式:
获取shutil支持的压缩格式代码:
In [1]: import shutil
In [2]: shutil.get_archive_formats()
Out[2]:
[('bztar', "bzip2'ed tar-file"),
('gztar', "gzip'ed tar-file"),
('tar', 'uncompressed tar file'),
('xztar', "xz'ed tar-file"),
('zip', 'ZIP file')]
也就是说,只支持上面的压缩格式(没有rar文件)
压缩文件代码:
In [9]: os.listdir()
Out[9]: ['统一作战平台需求管理.xlsx']
In [10]: shutil.make_archive('compress','gztar')
Out[10]: 'compress.tar.gz'
In [11]: os.listdir()
Out[11]: ['compress.tar.gz', '统一作战平台需求管理.xlsx']
压缩生成了compress.tar.gz文件。
解压缩文件代码:
In [14]: os.mkdir('test')
In [15]: shutil.move('compress.tar.gz','test')
Out[15]: 'test\\compress.tar.gz'
In [16]: os.chdir('test')
In [17]: os.listdir()
Out[17]: ['compress.tar.gz']
In [18]: shutil.unpack_archive('compress.tar.gz')
In [19]: os.listdir()
Out[19]: ['compress.tar.gz', '统一作战平台需求管理.xlsx']
解压缩文件成功了,并没有指定文件的后缀,比较简单使用。
下面自己写的一个简略解压缩版,只需要调用manager_decompress方法,入参是要解压文件的全名,和目标文件目录,写完查看shutil的源码,思路差不多,相对源码缺少异常处理,多了一种rar文件解压:
```python
def _zipfile_decompress(source_path, dest_path):
import zipfile
zip_compress_file = zipfile.ZipFile(source_path)
zip_compress_file.extractall(dest_path)
def _tarfile_decompress(source_path, dest_path):
import tarfile
with tarfile.open(source_path) as tar:
tar.extractall(dest_path)
def _gzfile_decompress(source_path, dest_path):
import gzip
gzip_file = gzip.GzipFile(source_path)
with gzip_file as fin:
with open(dest_path, 'wb') as fout:
fout.write(fin.read())
def _rarfile_decompress(source_path, dest_path):
"""要额外pip install rarfile"""
import rarfile
rar_file = rarfile.RarFile(source_path)
rar_file.extractall(dest_path)
def manager_decompress(file_path, dest_path):
support_dict = {"zip": _zipfile_decompress, "rar": _rarfile_decompress, "gz": _gzfile_decompress,
"tar": _tarfile_decompress}
suffix = file_path.split("\\.")[-1]
decompress = support_dict.get(suffix)
if decompress is None:
print("not support compress file")
decompress(file_path, dest_path)