【Python】 壓縮文件處理 zipfile & tarfile


【zipfile】

雖然叫zipfile,但是除了zip之外,rar,war,jar這些壓縮(或者打包)文件格式也都可以處理。

  zipfile模塊常用的一些操作和方法:

    is_zipfile(filename)  測試filename的文件,看它是否是個有效的zipfile

    ZipFile(filename[,mode[,compression[,allowZip64]]])  構造zipfile文件對象。mode可選r,w,a代表不同的打開文件的方式。compression指出這個zipfile用什么壓縮方法,默認是ZIP_STORED,另一種選擇是ZIP_DEFLATED。allowZip64是個bool型變量,當設置為True的時候就是說可以用來創建大小大於2G的zip文件,默認值是True

    ZipInfo  包含一個zip文件中的子文件的信息,字段包括filename(包括相對zip包的路徑),date_time(一個時間元組,該子文件最后修改時間),compress_type(該子文件的壓縮格式)等等。

 

  對於ZipFile實例z,有以下方法:

    z.close()  關閉文件

    z.extract(name[,path[,pwd]])  從zip中提取一個文件,將它放到指定的path下,pwd是密碼,用於被加密的zip文件

    z.extractall(path[,pwd])  將所有文件按照namelist中顯示得那樣的目錄結構從當前zip中提取出來並放到path下。//這兩個extract的path若不存在都會自動創建出來的,且這個path必須是個目錄,解壓時一定是把一個文件,包含其相對zip包路徑的所有目錄一起解壓出來。總之有點坑,自己測試一下就知道了

    z.namelist()  返回一個列表,內容是zip文件中所有子文件的path(相對於zip文件包而言的)。相當於是一個保存了zip內部目錄結構的列表

    z.infolist()  返回一個列表,內容是每個zip文件中子文件的ZipInfo對象,這個對象有上文中提到的那些字段

    z.printdir()  將zip文件的目錄結構打印到stdout上,包括每個文件的path,修改時間和大小

    z.open(name[,mode[,pwd]])  獲取一個子文件的文件對象,可以將其用來read,readline,write等等操作

    z.setpassword(psw)  可以為zip文件設置默認密碼

    z.testzip()  讀取zip中的所有文件,驗證他們的CRC校驗和。返回第一個損壞文件的名稱,如果所有文件都是完整的就返回None

    z.write(filename[,arcname[,compression_type]])  將zip外的文件filename寫入到名為arcname的子文件中(當然arcname也是帶有相對zip包的路徑的),compression_type指定了壓縮格式,也是ZIP_STORED或ZIP_DEFLATED。z的打開方式一定要是w或者a才能順利寫入文件。

 

  貼上兩個已經寫好的常用的解壓縮和壓縮函數:

  壓縮一個目錄:

def zip_dir(dirname,zipfilename):
    filelist = []
    if os.path.isfile(dirname):
        filelist.append(dirname)
    else :
        for root, dirs, files in os.walk(dirname):
            for dir in dirs:
                filelist.append(os.path.join(root,dir))
            for name in files:
                filelist.append(os.path.join(root, name))

    zf = zipfile.ZipFile(zipfilename, "w", zipfile.zlib.DEFLATED)
    for tar in filelist:
        arcname = tar[len(dirname):]
        #print arcname
        zf.write(tar,arcname)
    zf.close()

解壓縮一個文件:

def unzip_dir(zipfilename, unzipdirname):  
    fullzipfilename = os.path.abspath(zipfilename)  
    fullunzipdirname = os.path.abspath(unzipdirname)  
    print "Start to unzip file %s to folder %s ..." % (zipfilename, unzipdirname)  
    #Check input ...  
    if not os.path.exists(fullzipfilename):  
        print "Dir/File %s is not exist, Press any key to quit..." % fullzipfilename  
        inputStr = raw_input()  
        return  
    if not os.path.exists(fullunzipdirname):  
        os.mkdir(fullunzipdirname)  
    else:  
        if os.path.isfile(fullunzipdirname):  
            print "File %s is exist, are you sure to delet it first ? [Y/N]" % fullunzipdirname  
            while 1:  
                inputStr = raw_input()  
                if inputStr == "N" or inputStr == "n":  
                    return  
                else:  
                    if inputStr == "Y" or inputStr == "y":  
                        os.remove(fullunzipdirname)  
                        print "Continue to unzip files ..."  
                        break  
              
    #Start extract files ...  
    srcZip = zipfile.ZipFile(fullzipfilename, "r")  
    for eachfile in srcZip.namelist():
        if eachfile.endswith('/'):
            # is a directory
            print 'Unzip directory %s ...' % eachfilename
            os.makedirs(os.path.normpath(os.path.join(fullunzipdirname, eachfile)))
            continue  
        print "Unzip file %s ..." % eachfile  
        eachfilename = os.path.normpath(os.path.join(fullunzipdirname, eachfile))  
        eachdirname = os.path.dirname(eachfilename)  
        if not os.path.exists(eachdirname):  
            os.makedirs(eachdirname)  
        fd=open(eachfilename, "wb")  
        fd.write(srcZip.read(eachfile))  
        fd.close()  
    srcZip.close()  
    print "Unzip file succeed!"

 

【tarfile】

linux上常用的tar文件不被zipfile支持,應該要用tarfile模塊來處理tar文件,無論tar文件是否被壓縮還是僅僅被打包,都可以讀取和寫入tar文件。和zipfile模塊類似的,tarfile有以下一些方法和類:

  is_tarfile(filename)  檢查是否是個有效的tar文件

  open([name[,mode]])  和zipfile的ZipFile有所不同的是,這里的open除了指出打開文件的方式以外還指出了文件的壓縮方式。通過filemode[:compression]的方式可以指出很多種文件模式:

    'r'  讀打開,如果文件是壓縮得會被透明(???)地解壓縮。這是默認打開方式

    'r:'  讀打開,不壓縮文件

    'r:gz'  讀打開,使用gzip壓縮文件

    'r:bz2'  讀打開,使用bzip2壓縮文件

    'a','a:'  追加打開,不壓縮文件  //注意,a模式下不能加壓縮格式的。如果想要給壓縮包添加什么東西的話最好另尋他路

    'w','w:'  寫打開,不壓縮文件

    'w:gz'  寫打開,使用gzip壓縮文件

    'w:bz2'  寫打開只用bzip2壓縮文件

  TarInfo類對象 和ZipInfo類似的,一個子文件的TarInfo對象存儲了這個子文件的一些信息。TarInfo對象有一些方法和屬性:

    it.gid/gname  獲取這個子文件的組ID和組名稱

    it.uid/uname  獲取這個子文件的用戶id和用戶名稱

    ti.isdir()  判斷這個子文件是否是個目錄

    ti.isfile()  判斷是否是個普通文件

    ti.name  文件名

    ti.mode  權限

    ti.size  大小

    ti.mtime  最后修改時間

 

  由open返回的一個tarfile實例t有以下方法:

    t.add(name[,arcname,[recursive]])  將tar包外的文件或目錄name添加到tar包內的arcname,當name是個目錄時可把recursive設置為True來遞歸地加入tar包

    t.close()

    t.errorlevel  可以設置提取tar包中文件時如何確定處理錯誤,當這一屬性為0時,錯誤將被忽略,為1時錯誤將導致IOError和OSError,如果設置為2非致命性錯誤將會導致TarError

    t.extract(member[,path])  從tar包中提取一個子文件,保存到指定目錄下

    t.extractfile(member)  從tar包中提取一個子文件,但返回的是個類文件對象,可以通過read,write等方法來操作文件的內容

    t.getnames()  類似於zipfile中的namelist()

    t.ignore_zeros  若這一個屬性被設置為True的話,讀取tar包時會跳過空塊,如果這已設置為False則空塊表示tar包的結束。這個屬性的設置有利於讀取損壞的tar包

    t.list()  類似於zipfile的printdir(),但是其列出的信息更加詳細,如果不要這么詳細的信息,可以加上參數False

    t.getmemebers()  返回一個列表,內容是所有文件的TarInfo對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM