web-dev-qa-db-ja.com

pythonでファイルを解凍する

私はzipfileモジュールのドキュメントを読みましたが、unzip/ファイルの書き方を理解することができませんでした。 Zipファイルのすべての内容を同じディレクトリに解凍するにはどうすればよいですか。

294
John Howard
import zipfile
Zip_ref = zipfile.ZipFile(path_to_Zip_file, 'r')
Zip_ref.extractall(directory_to_extract_to)
Zip_ref.close()

それはほとんどそれです!

513
Rahul

Python 3.2以降を使用している場合

import zipfile
with zipfile.ZipFile("file.Zip","r") as Zip_ref:
    Zip_ref.extractall("targetdir")

これは を使うのでclosetry/catchを使う必要はありません。コンテキストマネージャ の構築.

261
user1741137

Python 2.6以降を使用している場合はextractallメソッドを使用してください。

Zip = ZipFile('file.Zip')
Zip.extractall()
32
Dan Breen

ZipFileのみインポートすることもできます:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.Zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Python 2Python 3で動作します。

2
simhumileco

これはZipとRARの両方に対する再帰的な解決策です。

  • 下記のPythonコードでファイルを作成するだけです。
  • python filename.pyのようにcmdからコードを実行します。
  • ZipまたはRARファイルの絶対パスを入力するように求められます。
  • Zipファイルと同じ名前のフォルダに抽出されたすべてのファイルを取得します。
  • これはWinrarの機能 "Extract Here"と同じです。
  • 追加の機能が1つ与えられます。再帰的抽出あなたのファイルに "a.Zip"が "b.Zip"、 "c.Zip"などの他の.Zipファイルを含んでいると言うならば、それらのファイルもネストされた方法で抽出されます。
  • rARサポートのためには、unrarとrarfileのpythonパッケージをインストールする必要があります。

    pip install unrar
    pip install rarfile
    
  • あなたはまだ終わっていない今、あなたはまた手動でwindowsとLinux用のunrarをインストールしなければなりません。

    Linuxの場合

    Sudo apt-get install unrar
    

    Windowsの場合

    ここをクリックしてunrar .exeファイルをダウンロードしてください

  • インストールしてください。

  • 今すぐプログラムファイルからインストールunrar.exeファイルを入手してください。
  • 通常の場所は:

    C:\Program Files (x86)\GnuWin32\bin\unrar.exe
    
  • このパスは、RARファイルの抽出時に使用される一般的なツールパスになるため、Windowsのパス変数に追加します

    rarfile.UNRAR_TOOL = C:\Program Files (x86)\GnuWin32\bin\unrar.exe
    

    すべてが設定されていれば、デプロイの準備は完了です。

-----------------------

#import Zip file.
import zipfile
# import rarfile
import rarfile
# for path checking.
import os.path
# deleting directory.
import shutil

def check_archrive_file(loc):
    '''
    check the file is an archive file or not.
    if the file is an archive file just extract it using the proper extracting method.
    '''
    # check if it is a Zip file or not.
    if (loc.endswith('.Zip') or loc.endswith('.rar')):
        # chcek the file is present or not .
        if os.path.isfile(loc):
            #create a directory at the same location where file will be extracted.
            output_directory_location = loc.split('.')[0]
            # if os path not exists .
            if not os.path.exists(output_directory_location):
                # create directory .
                os.mkdir(output_directory_location)
                print(" Otput Directory " , output_directory_location)
                # extract 
                if loc.endswith('.Zip'):
                    extractzip(loc,output_directory_location)
                else:
                    extractrar(loc,output_directory_location)

            else:
                # Directory allready exist.
                print("Otput Directory " , output_directory_location)
                # deleting previous directoty .
                print("Deleting old Otput Directory ")
                ## Try to remove tree; if failed show an error using try...except on screen
                try:
                    # delete the directory .
                    shutil.rmtree(output_directory_location)
                    # delete success
                    print("Delete success now extracting")
                    # extract
                    # extract 
                    if loc.endswith('.Zip'):
                        extractzip(loc,output_directory_location)
                    else:
                        extractrar(loc,output_directory_location)
                except OSError as e:
                    print ("Error: %s - %s." % (e.filename, e.strerror))
        else:
            print("File not located to this path")
    else:
        print("File do not have any archrive structure.")


def extractzip(loc,outloc):
    '''
    using the zipfile tool extract here .
    This function is valid if the file type is Zip only
   '''
    with zipfile.ZipFile(loc,"r") as Zip_ref:
        # iterate over Zip info list.
        for item in Zip_ref.infolist():
            Zip_ref.extract(item,outloc)
        # once extraction is complete
        # check the files contains any Zip file or not .
        # if directory then go through the directoty.
        Zip_files = [files for files in Zip_ref.filelist if files.filename.endswith('.Zip')]
        # print other Zip files
        # print(Zip_files)
        # iterate over Zip files.
        for file in Zip_files:
            # iterate to get the name.
            new_loc = os.path.join(outloc,file.filename)
            #new location
            # print(new_loc)
            #start extarction.
            check_archrive_file(new_loc)
        # close.
        Zip_ref.close()


def extractrar(loc,outloc):
    '''
    using the rarfile tool extract here .
    this function is valid if the file type is rar only
   '''
   #check the file is rar or not
    if(rarfile.is_rarfile(loc)):
        with rarfile.RarFile(loc,"r") as rar_ref:
                # iterate over Zip info list.
                for item in rar_ref.infolist():
                    rar_ref.extract(item,outloc)
                # once extraction is complete
                # get the name of the rar files inside the rar.
                rar_files = [file for file in rar_ref.infolist() if file.filename.endswith('.rar') ]
                # iterate
                for file in rar_files:
                    # iterate to get the name.
                    new_loc = os.path.join(outloc,file.filename)
                    #new location
                    # print(new_loc)
                    #start extarction.
                    check_archrive_file(new_loc)
                # close.
                rar_ref.close()
    else:
        print("File "+loc+" is not a rar file")




def checkpathVariables():
    '''
    check path variables.
    if unrar.exe nor present then 
    install unrar and set unrar.exe in path variable.
    '''
    try:
            user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
    except KeyError:
            user_paths = []
    # iterate over paths.
    for item in user_paths:
        print("User path python variables :"+user_paths)
    # check rar tool exe present or not.
    for item in user_paths:
        # print(item)
        if("unrar.exe" in item):
            print("Unrar tool setup found PYTHONPATH")
            return
    print("Unrar tool setup not found in  PYTHONPATH")
    # print os path
    os_paths_list = os.environ['PATH'].split(';')
    # check rar tool exe present or not.
    for item in os_paths_list:
        # print(item)
        if("unrar.exe" in item):
            print("Unrar tool setup found in PATH")
            rarfile.UNRAR_TOOL = item 
            print("Unrar tool path set up complete ."+item)
            return
    print("Unrar tool setup not found in PATH")
    print("RAR TOOL WILL NOT WORK FOR YOU.")
    downloadlocation = "https://www.rarlab.com/rar/unrarw32.exe"
    print("install unrar form the link"+downloadlocation)




# run the main function
if __== '__main__':
    '''
    before you run this function make sure you have installed two packages 
    unrar and rarfile.
    if not installed then 
    pip install unrar
    pip install rarfile.
    This is not only the case unrar tool should be set up.
    Zip is included in standard library so do not worry about the Zip file.
    '''
    # check path and variables.
    checkpathVariables()
    # Take input form the user.
    location = input('Please provide the absolute path of the Zip/rar file-----> ')
    check_archrive_file(location)

-----------------------

パニックにならないでくださいそれは主に四部に分けられる長いスクリプトです。

パート1

Path変数が正しくインストールされたことを確認してください。 RARファイルを扱いたくない場合は、このセクションは必要ありません。

def checkpathVariables():
    '''
    check path variables.
    if unrar.exe nor present then 
    install unrar and set unrar.exe in path variable.
    '''
    try:
            user_paths = os.environ['PYTHONPATH'].split(os.pathsep)
    except KeyError:
            user_paths = []
    # iterate over paths.
    for item in user_paths:
        print("User path python variables :"+user_paths)
    # check rar tool exe present or not.
    for item in user_paths:
        # print(item)
        if("unrar.exe" in item):
            print("Unrar tool setup found PYTHONPATH")
            return
    print("Unrar tool setup not found in  PYTHONPATH")
    # print os path
    os_paths_list = os.environ['PATH'].split(';')
    # check rar tool exe present or not.
    for item in os_paths_list:
        # print(item)
        if("unrar.exe" in item):
            print("Unrar tool setup found in PATH")
            rarfile.UNRAR_TOOL = item 
            print("Unrar tool path set up complete ."+item)
            return
    print("Unrar tool setup not found in PATH")
    print("RAR TOOL WILL NOT WORK FOR YOU.")
    downloadlocation = "https://www.rarlab.com/rar/unrarw32.exe"
    print("install unrar form the link"+downloadlocation)

パート2

この関数はZipファイルを抽出します。 2つの引数locとoutlocを取ります。 loc = "絶対パスを持つファイル名" outloc = "抽出されるファイル".

def extractzip(loc,outloc):
        '''
        using the zipfile tool extract here .
        This function is valid if the file type is Zip only
       '''
        with zipfile.ZipFile(loc,"r") as Zip_ref:
            # iterate over Zip info list.
            for item in Zip_ref.infolist():
                Zip_ref.extract(item,outloc)
            # once extraction is complete
            # check the files contains any Zip file or not .
            # if directory then go through the directoty.
            Zip_files = [files for files in Zip_ref.filelist if files.filename.endswith('.Zip')]
            # print other Zip files
            # print(Zip_files)
            # iterate over Zip files.
            for file in Zip_files:
                # iterate to get the name.
                new_loc = os.path.join(outloc,file.filename)
                #new location
                # print(new_loc)
                #start extarction.
                check_archrive_file(new_loc)
            # close.
            Zip_ref.close()

パート3

この関数はRARファイルを抽出します。 Zipとほぼ同じです。

def extractrar(loc,outloc):
        '''
        using the rarfile tool extract here .
        this function is valid if the file type is rar only
       '''
       #check the file is rar or not
        if(rarfile.is_rarfile(loc)):
            with rarfile.RarFile(loc,"r") as rar_ref:
                    # iterate over Zip info list.
                    for item in rar_ref.infolist():
                        rar_ref.extract(item,outloc)
                    # once extraction is complete
                    # get the name of the rar files inside the rar.
                    rar_files = [file for file in rar_ref.infolist() if file.filename.endswith('.rar') ]
                    # iterate
                    for file in rar_files:
                        # iterate to get the name.
                        new_loc = os.path.join(outloc,file.filename)
                        #new location
                        # print(new_loc)
                        #start extarction.
                        check_archrive_file(new_loc)
                    # close.
                    rar_ref.close()
        else:
            print("File "+loc+" is not a rar file")

パート4

メイン関数はユーザに絶対パスを尋ねます。場所の値を設定することで、定義済みのパスに変更できます。そして入力機能をコメントアウトします。

if __== '__main__':
    '''
    before you run this function make sure you have installed two packages 
    unrar and rarfile.
    if not installed then 
    pip install unrar
    pip install rarfile.
    This is not only the case unrar tool should be set up.
    Zip is included in standard library so do not worry about the Zip file.
    '''
    # check path and variables.
    checkpathVariables()
    # Take input form the user.
    location = input('Please provide the absolute path of the Zip/rar file-----> ')
    check_archrive_file(location)

まだ存在する問題.

  • この解決策では、すべての種類のRARファイルを抽出することはできません。
  • 確認に合格していますがrarfile.is_rarfile("filename")
  • WinRARによって作成されたRARを確認したところ、警告が表示され、ファイルは解凍されません。

    [あなたがこの警告と問題について手助けできるならコメントしてください]

    rarfile.RarWarning: Non-fatal error [1]: b'\r\nD:\\Kiosk\\Download\\Tutorial\\reezoo\\a.rar is not RAR archive\r\nNo files to extract\r\n
    
  • しかし、それは簡単にRAR4タイプを抽出することができます。

2
Reezoo Bose
import os 
Zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = Zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    Zip=zipfile.ZipFile(f)
    Zip.extractall(Zip_file_path)

Zipでない場合、これはファイルの検証を含みません。フォルダに.zip以外のファイルが含まれていると失敗します。

1
user3911901

これを試して :


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.Zip'):
            filePath=path+'/'+file
            Zip_file = zipfile.ZipFile(filePath)
            for names in Zip_file.namelist():
                Zip_file.extract(names,path)
            Zip_file.close() 

path:ファイルのパスを解凍します

0
Done Jin