1. 程式人生 > >python zipfile extract 解壓 中文檔名

python zipfile extract 解壓 中文檔名

正常使用:

解壓縮: ZipFile.extract(member,path = None,pwd = None )

引數 解釋
members zipfile 物件中某個檔名
path 解壓到的目的路徑,預設是壓縮包所在路徑
pwd 壓縮包密碼, 預設無密碼

例子

import zipfile

...
zip_file = zipfile.ZipFile(file_name, 'r')

try:
    for names in zip_file.namelist():
        zip_file.extract(names, path=mypath)
except Exception as e:
    raise

壓縮: 利用 write 方法, ZipFile.write(filename, arcname=None, compress_type=None)

引數 解釋
filename 檔名
arcname 壓縮檔名
compress_type If given, compress_type overrides the value given for the compression parameter to the constructor for the new entry. 如果給定,compress_type將為新條目覆蓋為壓縮引數給建構函式指定的值。沒用過不知道啥用。
  1. 注意: ZIP檔案沒有官方檔名編碼。如果你有unicode檔名,你必須在將它們傳遞給你所需的編碼之前將它們轉換為位元組串write()。WinZip將所有檔名解釋為在CP437中編碼,也稱為DOS Latin。
  2. 注意: 檔案名稱應該與檔案根目錄相關,也就是說,它們不應該以路徑分隔符開頭。
  3. 注意: 如果arcname(或者filename如果arcname未給出)包含空位元組,則歸檔檔案的名稱將在空位元組處截斷。

例子

def get_zip(filename, target_list, to_path=current_dir):
    """
    zip file
    :param filename: 壓縮包命名
    :param target_list: [(帶壓縮檔案絕對路徑,壓縮後文件起名(相對路徑)),....] 列表
    :param to_path: 壓縮包儲存路徑
    :return: get_zip('SDA-ST-2000',
    [[('/Users/sunping/avlsdk3/0ecccee29a1a47afbb09cba842f79ca2','License.alf'),
 ('/Users/sunping/avlsdk3/b92272762514429392a6d2fe8cd696f4','.DS_Store'),
 ('/Users/sunping/avlsdk3/9acd9ead7b4b4ebdb0b59288d9d08368','AVLSDK.so'),
 ('/Users/sunping/avlsdk3/38c4785d6fac4988bb256bc8b29e23d3','AVLScanner.exe'),
 ('/Users/sunping/avlsdk3/eff46ac936374111b9224e81c1a39bef','aid2name.so')], '/Users/sunping/antiy/client')
    """
z = zipfile.ZipFile(path_join(to_path, filename+'.zip'), 'w') for t, s in target_list: z.write(t, s) z.close()

解決解壓中文檔名報錯

丟擲異常: Illegal byte sequence, ‘ascii’ codec can’t decode byte … in position ……. 等等 諸如此類的錯誤,其實都是編碼問題!!!

思路1: 直接讀取/開啟壓縮包內檔案, 利用 open 寫入指定檔案

注意: 這裡不能使用 zipfile 物件的 namelist() 方法, 採用遍歷 zipfile 物件的 infolist() 方法

程式碼舉例

import sys
import shutil
import zipfile

...
zip_file = zipfile.ZipFile(file_name, 'r')

try:
    for file_info in zip_file.infolist():

        filename = unicode(file_info.filename, 'gb2312').encode("utf8")  # 採用什麼編碼就用什麼解碼,再用 utf8 編碼
        # filename = file_info.encode('gb2312').decode('utf-8')  # 也可以寫成這樣
        print 'filename is ', filename
        output_filename = os.path.join(name, filename)
        output_file_dir = os.path.dirname(output_filename)
        if not os.path.exists(output_file_dir):
            os.makedirs(output_file_dir)
        with open(output_filename, 'wb') as f:
            shutil.copyfileobj(zip_file.open(file_info.filename), f)

except Exception as e:
    Logger(sys.exc_info()[2]).error(e)

思路2 採用 extractall 方法

可以省略指定解壓檔案物件

import zipfile

...
zip_file = zipfile.ZipFile(file_name, 'r')
global zip_file
yourpath = '/xxx/xxxx/xxxx...'
try:
    zip_file.extractall(path=yourpath)
except Exception as e:
    Logger(sys.exc_info()[2]).error(e)
finally:
    zip_file.close

補充

python2.7. zipfile 中 處理檔名 :

def _encodeFilenameFlags(self):
    if isinstance(self.filename, unicode):
        try:
            return self.filename.encode('ascii'), self.flag_bits
        except UnicodeEncodeError:
            return self.filename.encode('utf-8'), self.flag_bits | 0x800
    else:
        return self.filename, self.flag_bits

def _decodeFilename(self):
    if self.flag_bits & 0x800:
        return self.filename.decode('utf-8')
    else:
        return self.filename

python 3.6 zipfile 中 處理檔名:

# 編碼
if flags & 0x800:
    # UTF-8 file names extension
    filename = filename.decode('utf-8')
else:
    # Historical ZIP filename encoding
    filename = filename.decode('cp437')
# 解碼
if zinfo.flag_bits & 0x800:
    # UTF-8 filename
    fname_str = fname.decode("utf-8")
else:
    fname_str = fname.decode("cp437")

相關推薦

python zipfile extract 中文檔名

正常使用: 解壓縮: ZipFile.extract(member,path = None,pwd = None ) 引數 解釋 members zipfile 物件中某個檔名 path 解壓到的目的路徑,預設

如何在Linux下中文檔名的壓縮包

最近我的一個同事傳給我一個很大的音樂壓縮檔案。其中的很多的資料夾和中文歌曲在Ubuntu下顯示如下: 當我通過解壓的方式把檔案解壓到我的Ubuntu桌面後,顯示的是很多的亂碼。我們該如何解決這個問題呢? 具體的解決辦法如下: 1)通過如下的命令,解壓我們的.zip

python zip 檔案中文亂碼問題解決

今天突然碰到zip檔案解壓後中文亂碼問題。百度了下覺得這篇文章不錯。儲存儲存。 來源:http://blog.sina.com.cn/s/blog_5805e98101012uzv.html 萬惡的編碼!!!!!!!!!! 學習 python 2.x 時就被時不時出現

Python: zipfile壓縮檔案

判斷是否是ZIP檔案 用zipfile.is_zipfile判斷。 import zipfile print(zipfile.is_zipfile('samples/archive.zip

python使用zipfile中文亂碼問題

              在zipfile.ZipFile中獲得的filename有中日文則很大可能是亂碼,這是因為 在zip標準中,對檔名的 encoding 用的不是 unicode,而可能是各種軟體根據系統的預設字符

Python-zipfile中文問題

本文例項講述了Python遍歷zip檔案輸出名稱時出現亂碼問題的解決方法。分享給大家供大家參考。具體如下: windows中使用python2.7遍歷zip檔案之後輸出檔名等資訊,console列印的中文及一些標點出現亂碼。查了一下網上說的windows的編碼

python3 解決zip中文亂碼問題,親測可用, ZipFile

""" Read and write ZIP files. XXX references to utf-8 need further investigation. """ import io import os import re import importlib.util impor

python遞迴資料夾中所有壓縮包

1. 簡述     遞迴解壓資料夾中的所有壓縮包到指定資料夾 2. 環境配置     python解壓rar檔案需要安裝依賴庫 (python-unrar)     Windows: 在 RARLab 官

Python打包與zip

打包 shutil模組 shutil.make_archive(base_name, format[, root_dir[, base_dir[, verbose[, dry_run[, owner[, group[, logger]]]]]]]) 引數說明:

unzip命令中文亂碼

原來在windows上的zip檔案, 在CentOS上使用unzip直接解壓會顯示亂碼, 因為windows簡體中文版的作業系統一般上用的是GBK編碼, 所以會導致這個問題, 可以使用-O引數來解決

Python基礎(序列)

 解壓序列: 1 a,b=(1,2) 2 # a,b=[1,2] 3 print(a,b) 4 #輸出結果:1 2 5 6 #獲取第一個值和最後一個值 7 a,*_,c=(1,2,3,4,5,6,7,8,9) 8 print(a) 9 print(c) 10 # 輸出結果

python tar 壓縮

  壓縮: 1. import tarfile import os def tar(fname): t = tarfile.open(fname + ".tar.gz", "w:gz") for root, dir, files in os.walk(fname):

關於Linux下檔案檔名亂碼問題

#!/usr/bin/env python # -*- coding: utf-8 -*- # uzip.py   import os import sys import zipfile   print "Processing File " + sys.argv[1]   file=zipfile.ZipFi

DoNetZip壓縮中文檔名亂碼的解決方案

今天踩進了這個坑裡,寫一下省的後面的人掉坑 using (ZipFile zip = new ZipFile(zip_file, Encoding.UTF8)) { zip.Extract

Python】使用 zipfile 含有中文檔名的 zip 檔案

問題 在使用 Python 內建標準庫 zipfile 解壓檔案時,如果壓縮檔案中有的檔案含有中文,那麼解壓後就會發現檔名中的中文部分是亂碼。例如我分別新建三個 txt 檔案:檔案1.txt,檔案2.txt 和 檔案3.txt,然後將這三個檔案壓縮到一個名為

解決python中用zipfile壓縮檔案時中文檔名亂碼的問題

來源:http://blog.sina.com.cn/s/blog_5805e98101012uzv.html 萬惡的編碼!!!!!!!!!! 學習 python 2.x 時就被時不時出現的中文亂碼問題搞得頭大,無奈用起來資料挺少、支援不多的 python 3.x,沒

pythonzipfile模塊打包文件或是目錄、zip文件實例

pre art directory zipfile dir col file r+ ted #!/usr/bin/env python # -*- coding: utf-8 -*- from zipfile import * import zipfile

Python使用urllib下載檔案以及使用zipfile檔案

首先定義檔案下載路徑,檔名 import os from six.moves import urllib import zipfile DATA_URL = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00240/UCI%

nodejs adm-zip 檔案 中文檔名亂碼

最近的一個專案需要上傳zip檔案到伺服器,然後解壓到當前目錄,最初選用unzip包進行解壓,開始使用的時候不知道這個包有監聽函式,認為完全是同步的。實際是有完成解壓監聽函式的。使用adm-zip的時候是同步的,滿足需要,但是如果資料夾種有中文檔名的時候在windows下壓縮

linux下下載的zip檔案之後中文檔名亂碼

我在下載一些檔案的時候,我的ubunt 14.04預設按照zip檔案給我打包下載的,但是下載下來之後,發現解壓之後我的中文檔名先試試的都為亂碼,後來看了其他部落格博主的一些解決方法,發現這麼一個好的方法,親試OK的。 第一步 首先安裝7zip和convmv(如