使用Python 2.7.5将文件夹中的所有压缩文件解压缩到同一文件夹

使用Python 2.7.5将文件夹中的所有压缩文件解压缩到同一文件夹,python,python-2.7,unzip,zipfile,arcpy,Python,Python 2.7,Unzip,Zipfile,Arcpy,我想写一个简单的脚本来迭代一个文件夹中的所有文件,并将那些压缩的(.zip)解压缩到同一个文件夹中。对于这个项目,我有一个包含近100个压缩的.las文件的文件夹,我希望有一个简单的方法来批量解压缩它们。我试着用下面的脚本 import os, zipfile folder = 'D:/GISData/LiDAR/SomeFolder' extension = ".zip" for item in os.listdir(folder): if item.endswith(extens

我想写一个简单的脚本来迭代一个文件夹中的所有文件,并将那些压缩的(.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)
收益率:

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文件,其中文件可以是文件(字符串)的路径,也可以是类似文件的对象

在我看来,一切似乎都存在并得到了解释。我只是不明白我做错了什么

有什么建议吗


谢谢

您需要用文件名构造一个
ZipFile
对象,然后将其解压缩:

    zipfile.ZipFile.extract(item)
这是错误的

    zipfile.ZipFile(item).extractall()
将从zip文件中提取名称包含在
项中的所有文件


我认为您应该更仔细地阅读zipfile的文档,但是您的思路是正确的

下面是为我工作的代码:

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 = 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()

我觉得这个比较短,对我来说效果很好。首先导入所需的模块:

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

谢谢你的解释,伙计!!我的问题是,我提取的所有文件都有相同的文件名,当我使用extractall时,它会直接粉碎文件,只留下最后一个文件。我应该更改它的名称,但我不知道如何更改@Chenlu@Borja_042我建议创建一个count变量,然后在提取时将其添加到文件名中。在循环内部,将count变量附加到dir名称。如果我想解压文件夹和子文件夹中的
zip
文件,该怎么办?
extractall
的文档位于:此解决方案适合我。它也比公认的答案更像蟒蛇。简短简单的答案是最好的!
working_directory = 'my_directory'
os.chdir(working_directory)
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