怎样用Python解压缩*.tgz文件

发布时间:2019-08-27 08:14:52编辑:auto阅读(2133)

    怎样用Python解压缩*.tgz文件

    KnightPython:

    正如*大熊*所说,使用tarfile模块即可:
    import tarfile
    tarobj = tarfile.open("my_backup_file.tgz", "r:gz")
    for tarinfo in tarobj:
        tarobj.extract(tarinfo.name, r"d:/temp/backup")
    tarobj.close()
    十分感谢!

    ============

    把 cygwin/msys/mingw 的 tar.exe、gzip.exe、gunzip.exe 这些一块拷过去,
    使用
    os.system() 调用

    =============

    Windows下最常见的压缩文件只有两种,.zip和.rar。可是Linux就不同了,有.Z、bz2、.gz、.tar、.tar.gz等众多的压 缩文件名,它们分别对应了各种压缩打包命令。要了解这些压缩打包命令的使用,首先要弄清两个概念:打包和压缩。打包是指将一大堆文件或目录什么的变成一个 总的文件,压缩则是将一个大的文件通过一些压缩算法变成一个小文件。Linux中的很多压缩命令只能针对一个文件进行压缩,当要压缩一大堆文件时,就得先 借助打包命令将这一大堆文件先打成一个包,然后再用压缩命令进行压缩。因此打包命令在Linux的应用中具有很重要的作用。
    Linux下最常用的打包命令就是tar,使用tar命令打包后,就可以用其它的命令来进行压缩了。tar命令的使用方法如下:

    tar [-cxtzjvfpPN] 文件与目录
    参数说明:
    -c :建立一个打包文件;
    -x :解开一个打包文件;
    -t :查看 tar包里面的文件;
    (特别注意,在选择参数时,c/x/t仅能存在一个,不可同时存在,因为不可能同时压缩与解压缩。)
    -z :打包后用gzip压缩,生成.tar.gz文件;
    -j :打包后用zip2压缩,生成.tar.bz2文件;
    -v :压缩的过程中显示文件;
    -f :使用文件名,请留意,在f之后要立即接文件名,不要再加其它参数;
    -p :保持原文件的属性;
    -P :使用绝对路径来压缩;
    -N :设定日期(yyyy/mm/dd),比后面接的日期还要新的文件才会被打包进新建的文件中;
    --exclude FILE:在打包的过程中,不要将FILE打包。

    举几个例子:

    例一:将整个/etc目录下的文件全部打包成为/tmp/etc.tar
    tar -cvf /tmp/etc.tar /etc  #仅打包,不压缩
    tar -zcvf /tmp/etc.tar.gz /etc  #打包后,以gzip压缩
    tar -jcvf /tmp/etc.tar.bz2 /etc  #打包后,以bzip2压缩

    例二:查阅上述/tmp/etc.tar.gz文件内有哪些文件
    tar -ztvf /tmp/etc.tar.gz

    例三:将/tmp/etc.tar.gz文件解压缩到/usr/local/src下
    cd /usr/local/src   #先将工作目录变换到/usr/local/src下
    tar -zxvf /tmp/etc.tar.gz
      
    例四:只将/tmp/etc.tar.gz内的etc/passwd解压到/tmp下
    cd /tmp
    tar -zxvf /tmp/etc.tar.gz etc/passwd

    例五:将/etc内的所有文件备份下来,并且保存其权限!
    tar -zxvpf /tmp/etc.tar.gz /etc

    例六:在/home当中,比2005/06/01新的文件才备份
    tar -N '2005/06/01' -zcvf home.tar.gz /home

    例七:备份/home、/etc,但不要/home/dmtsai
    tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

    例八:将/etc打包后直接解开在/tmp底下,而不产生文件!
    cd /tmp
    tar -cvf - /etc | tar -xvf -





    现在有一个需求,不知道该如何才能实现
    压缩: tar czvf /data/backup/test.tar.gz /data/a/b/directory
    解压:
    cd /data/test
    tar xzvf /data/backup/test.tar.gz

    问题是,解压后的文件,在/data/test/data/a/b/directory里面
    能否压缩时只保留directory以下的所有目录,以directory作为/,而不是/data/a/b/directory?

    问题已经解决,找到了GNU tar的官方资料
    http://www.delorie.com/gnu/docs/tar/tar_98.html

    这样写就可以解决了
    tar czvf /data/backup/test.tar.gz /data/a/b/directory
    改成
    tar czvf /data/backup/test.tar.gz -C /data/a/b(空格)directory


    -C是临时切换工作目录,-P是绝对路径,在这里只用到-C参数就行了

    ================

    之前写了一个自动解压压缩文件到压缩文件所在文件夹的脚本
    后根据自己需要,写了另外两个。原理一样
    都是使用winrar的命令
    第一个脚本没考虑周到,只能解压rar文件
    改进后可以支持winrar支持的各种文件
    把指定文件夹下的文件保存到指定文件夹
    #rardir.py
    import os
    import sys
    src=sys.argv[1]
    dst=sys.argv[2]
    format=['rar','zip','7z','ace','arj','bz2','cab','gz','iso','jar','lzh','tar','uue','z']
    os.chdir(sys.argv[1])
    for file in os.listdir('.'):
    if os.path.isfile(file) and (os.path.splitext(file)[1][1:].lower() in format)==True:
    #cmd='winrar x -ibck "'+file+'" "'+dst+'//'+os.path.splitext(file)[0]+'//"'
    cmd='winrar x -ibck "'+file+'" "'+dst+'//"'
    os.system(cmd)
    os.remove(file)
    print('done '+file)
    第一个版本的改进
    #rardecmp.py
    #decompress with winrar
    #arguments :filename directory opt
    # opt='mkdir' to create directory with the correspond filename
    # opt='direct' to decompress rar files in current directory
    # opt='mk&del' to mkdir and delete rar file
    import os
    import sys
    if len(sys.argv)!=3:
    print ('wrong arguments/n')
    print ('rar.py directory opt/n')
    print ('opt=/'mkdir/' to create directory with the correspond filename/n')
    print ('opt=/'direct/' to decompress rar files in current directory/n')
    print ('opt=/'diredel/' to decompress rar files in current directory and delete files/n')
    print ('opt=/'mkdel/' to mkdir and delete rar file/n')
    exit(0)
    #-ibck ,minimized when running
    opt=sys.argv[2]
    os.chdir(sys.argv[1])
    format=['rar','zip','7z','ace','arj','bz2','cab','gz','iso','jar','lzh','tar','uue','z']
    for file in os.listdir('.'):
    if os.path.isfile(file) and (os.path.splitext(file)[1][1:].lower() in format)==True:
    if opt=='mkdir':
    cmd='winrar x -ibck "'+file+'"'+' "'+os.path.splitext(file)[0]+'"//'
    os.system(cmd)
    elif opt=='direct':
    cmd='winrar x -ibck "'+file+'"'
    os.system(cmd)
    ......

关键字