web-dev-qa-db-ja.com

Python 2.7.5を使用して、フォルダー内のすべての圧縮ファイルを同じフォルダーに解凍します。

フォルダー内のすべてのファイルを反復処理し、zipされたファイル(.Zip)を同じフォルダーに解凍する簡単なスクリプトを記述したいと思います。このプロジェクトの場合、100個近くの.lasファイルが圧縮されたフォルダーがあり、それらをバッチで簡単に解凍できる方法を望んでいます。次のスクリプトで試しました

import os, zipfile

folder = 'D:/GISData/LiDAR/SomeFolder'
extension = ".Zip"

for item in os.listdir(folder):
    if item.endswith(extension):
        zipfile.ZipFile.extract(item)

しかし、スクリプトを実行すると、次のエラーが発生します。

Traceback (most recent call last):
  File "D:/GISData/Tools/MO_Tools/BatchUnzip.py", line 10, in <module>
    extract = zipfile.ZipFile.extract(item)
TypeError: unbound method extract() must be called with ZipFile instance as first argument (got str instance instead)

python 2.7.5インタプリタを使用しています。zipfileモジュール( https://docs.python.org/2/library/zipfile.html #module-zipfile )そして、私が間違っていることを理解したいと思います。

私の考えでは、プロセスは次のようになります。

  1. フォルダ名を取得
  2. フォルダをループしてZipファイルを見つける
  3. フォルダにZipファイルを抽出する

Marcusに感謝しますが、提案を実装すると、別のエラーが発生します。

Traceback (most recent call last):
  File "D:/GISData/Tools/MO_Tools/BatchUnzip.py", line 12, in <module>
    zipfile.ZipFile(item).extract()
  File "C:\Python27\ArcGIS10.2\lib\zipfile.py", line 752, in __init__
    self.fp = open(file, modeDict[mode])
IOError: [Errno 2] No such file or directory: 'JeffCity_0752.las.Zip'

印刷ステートメントを使用すると、ファイルがそこにあることがわかります。例えば:

for item in os.listdir(folder):
    if item.endswith(extension):
        print os.path.abspath(item)
        filename = os.path.basename(item)
        print filename

利回り:

D:\GISData\Tools\MO_Tools\JeffCity_0752.las.Zip
JeffCity_0752.las.Zip
D:\GISData\Tools\MO_Tools\JeffCity_0753.las.Zip
JeffCity_0753.las.Zip

ドキュメントを理解すると、

zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

Zipファイルを開きます。fileは、ファイルへのパス(文字列)またはファイルのようなオブジェクトです。

すべてが存在し、説明されているように見えます。私は何が間違っているのか理解できません。

助言がありますか?

ありがとうございました

14
tpdance

以下は私のために働いたコードです:

import os, zipfile

dir_name = 'C:\\SomeDirectory'
extension = ".Zip"

os.chdir(dir_name) # change directory from working dir to dir with files

for item in os.listdir(dir_name): # loop through items in dir
    if item.endswith(extension): # check for ".Zip" extension
        file_name = os.path.abspath(item) # get full path of files
        Zip_ref = zipfile.ZipFile(file_name) # create zipfile object
        Zip_ref.extractall(dir_name) # extract file to dir
        Zip_ref.close() # close file
        os.remove(file_name) # delete zipped file

修正したコードを振り返ると、ディレクトリがスクリプトのディレクトリと混同されていました。

以下は、作業ディレクトリを壊さなくても機能します。最初に行を削除します

os.chdir(dir_name) # change directory from working dir to dir with files

次にfile_nameを次のように割り当てます

file_name = dir_name + "/" + item
31
tpdance

受け入れられた答えはうまくいきます!

ディレクトリ内のすべてのサブディレクトリ内の.Zip拡張子を持つすべてのファイルを解凍するというアイデアを拡張するために、次のコードはうまく機能するようです:

import os
import zipfile

for path, dir_list, file_list in os.walk(dir_path):
    for file_name in file_list:
        if file_name.endswith(".Zip"):
            abs_file_path = os.path.join(path, file_name)

            # The following three lines of code are only useful if 
            # a. the Zip file is to unzipped in it's parent folder and 
            # b. inside the folder of the same name as the file

            parent_path = os.path.split(abs_file_path)[0]
            output_folder_name = os.path.splitext(abs_file_path)[0]
            output_path = os.path.join(parent_path, output_folder_name)

            Zip_obj = zipfile.ZipFile(abs_file_path, 'r')
            Zip_obj.extractall(output_path)
            Zip_obj.close()
5
0Nicholas

ファイル名を使用してZipFileオブジェクトを作成し、thenで抽出する必要があります。

    zipfile.ZipFile.extract(item)

間違っている。

    zipfile.ZipFile(item).extractall()

itemに含まれている名前のZipファイルからすべてのファイルを抽出します。

zipfileへのドキュメンテーションをもっとよく読むべきだと思いますが、あなたは正しい道を進んでいます!

4
Marcus Müller

これは短く、私にとってはうまくいったと思います。まず、必要なモジュールをインポートします。

import zipfile, os

次に、作業ディレクトリを定義します。

working_directory = 'my_directory'
os.chdir(working_directory)

その後、oszipfileの組み合わせを使用して、必要な場所を取得できます。

for file in os.listdir(working_directory):   # get the list of files
    if zipfile.is_zipfile(file): # if it is a zipfile, extract it
        with zipfile.ZipFile(file) as item: # treat the file as a Zip
           item.extractall()  # extract it in the working directory
3
Bondify