使用 Python 2.7.5 将文件夹中的所有压缩文件解压缩到同一文件夹
Unzip all zipped files in a folder to that same folder using Python 2.7.5
我想编写一个简单的脚本来遍历文件夹中的所有文件,并将压缩 (.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) 的文档,我想了解我做错了什么。
我想在我看来,这个过程应该是这样的:
- 获取文件夹名称
- 遍历文件夹并找到 zip 文件
- 将 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]]])
Open a ZIP file, where file can be either a path to a file (a string) or a file-like object
在我看来,一切都存在并得到了解释。我只是不明白我做错了什么。
有什么建议吗?
谢谢
您需要用文件名构造一个ZipFile
对象,然后然后提取它:
zipfile.ZipFile.extract(item)
错了。
zipfile.ZipFile(item).extractall()
将从 zip 文件中提取名称包含在 item
中的所有文件。
我认为您应该更仔细地阅读 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赋值为
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
.
的递归 版本
将其用于 子文件夹 和子文件夹。致力于 Python 3.8
import os
import zipfile
base_dir = '/Users/john/data' # absolute path to the data folder
extension = ".zip"
os.chdir(base_dir) # change directory from working dir to dir with files
def unpack_all_in_dir(_dir):
for item in os.listdir(_dir): # loop through items in dir
abs_path = os.path.join(_dir, item) # absolute path of dir or file
if item.endswith(extension): # check for ".zip" extension
file_name = os.path.abspath(abs_path) # get full path of file
zip_ref = zipfile.ZipFile(file_name) # create zipfile object
zip_ref.extractall(_dir) # extract file to dir
zip_ref.close() # close file
os.remove(file_name) # delete zipped file
elif os.path.isdir(abs_path):
unpack_all_in_dir(abs_path) # recurse this function with inner folder
unpack_all_in_dir(base_dir)
我想编写一个简单的脚本来遍历文件夹中的所有文件,并将压缩 (.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) 的文档,我想了解我做错了什么。
我想在我看来,这个过程应该是这样的:
- 获取文件夹名称
- 遍历文件夹并找到 zip 文件
- 将 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]]])
Open a ZIP file, where file can be either a path to a file (a string) or a file-like object
在我看来,一切都存在并得到了解释。我只是不明白我做错了什么。
有什么建议吗?
谢谢
您需要用文件名构造一个ZipFile
对象,然后然后提取它:
zipfile.ZipFile.extract(item)
错了。
zipfile.ZipFile(item).extractall()
将从 zip 文件中提取名称包含在 item
中的所有文件。
我认为您应该更仔细地阅读 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赋值为
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
将其用于 子文件夹 和子文件夹。致力于 Python 3.8
import os
import zipfile
base_dir = '/Users/john/data' # absolute path to the data folder
extension = ".zip"
os.chdir(base_dir) # change directory from working dir to dir with files
def unpack_all_in_dir(_dir):
for item in os.listdir(_dir): # loop through items in dir
abs_path = os.path.join(_dir, item) # absolute path of dir or file
if item.endswith(extension): # check for ".zip" extension
file_name = os.path.abspath(abs_path) # get full path of file
zip_ref = zipfile.ZipFile(file_name) # create zipfile object
zip_ref.extractall(_dir) # extract file to dir
zip_ref.close() # close file
os.remove(file_name) # delete zipped file
elif os.path.isdir(abs_path):
unpack_all_in_dir(abs_path) # recurse this function with inner folder
unpack_all_in_dir(base_dir)