使用python语言在linux系统解压文件

近期在做日志分析功能,需要解压大量的文件,文件的情况比较复杂,包括大文件,文件类型多,压缩文件中含压缩文件。使用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)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值