フォルダー内のすべてのファイルを反復処理し、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 )そして、私が間違っていることを理解したいと思います。
私の考えでは、プロセスは次のようになります。
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は、ファイルへのパス(文字列)またはファイルのようなオブジェクトです。
すべてが存在し、説明されているように見えます。私は何が間違っているのか理解できません。
助言がありますか?
ありがとうございました
以下は私のために働いたコードです:
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
受け入れられた答えはうまくいきます!
ディレクトリ内のすべてのサブディレクトリ内の.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()
ファイル名を使用してZipFile
オブジェクトを作成し、thenで抽出する必要があります。
zipfile.ZipFile.extract(item)
間違っている。
zipfile.ZipFile(item).extractall()
item
に含まれている名前のZipファイルからすべてのファイルを抽出します。
zipfile
へのドキュメンテーションをもっとよく読むべきだと思いますが、あなたは正しい道を進んでいます!
これは短く、私にとってはうまくいったと思います。まず、必要なモジュールをインポートします。
import zipfile, os
次に、作業ディレクトリを定義します。
working_directory = 'my_directory'
os.chdir(working_directory)
その後、os
とzipfile
の組み合わせを使用して、必要な場所を取得できます。
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