Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unzip all zipped files in a folder to that same folder using Python 2.7.5

I would like to write a simple script to iterate through all the files in a folder and unzip those that are zipped (.zip) to that same folder. For this project, I have a folder with nearly 100 zipped .las files and I'm hoping for an easy way to batch unzip them. I tried with following script

import os, zipfile  folder = 'D:/GISData/LiDAR/SomeFolder' extension = ".zip"  for item in os.listdir(folder):     if item.endswith(extension):         zipfile.ZipFile.extract(item) 

However, when I run the script, I get the following error:

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) 

I am using the python 2.7.5 interpreter. I looked at the documentation for the zipfile module (https://docs.python.org/2/library/zipfile.html#module-zipfile) and I would like to understand what I'm doing incorrectly.

I guess in my mind, the process would go something like this:

  1. Get folder name
  2. Loop through folder and find zip files
  3. Extract zip files to folder

Thanks Marcus, however, when implementing the suggestion, I get another error:

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' 

When I use print statements, I can see that the files are in there. For example:

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

yields:

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 

As I understand the documentation,

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

It appears to me like everything is present and accounted for. I just don't understand what I'm doing wrong.

Any suggestions?

Thank You

like image 651
tpdance Avatar asked Jul 10 '15 17:07

tpdance


People also ask

How do I extract all zip files from a directory in Python?

To unzip a file in Python, use the ZipFile. extractall() method. The extractall() method takes a path, members, pwd as an argument and extracts all the contents. To work on zip files using Python, we will use an inbuilt python module called zipfile.

Can 7-zip unzip multiple files at once?

After 7-Zip is installed you can select multiple . zip files, right-click on them, navigate to the 7-Zip pop-up menu, and choose the: Extract to "*\" option . This will extract each .


2 Answers

Below is the code that worked for me:

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 

Looking back at the code I had amended, the directory was getting confused with the directory of the script.

The following also works while not ruining the working directory. First remove the line

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

Then assign file_name as

file_name = dir_name + "/" + item 
like image 180
tpdance Avatar answered Oct 02 '22 02:10

tpdance


I think this is shorter and worked fine for me. First import the modules required:

import zipfile, os 

Then, I define the working directory:

working_directory = 'my_directory' os.chdir(working_directory) 

After that you can use a combination of the os and zipfile to get where you want:

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 
like image 41
Bondify Avatar answered Oct 02 '22 03:10

Bondify