Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extract files from zip without keeping the structure using python ZipFile?

I try to extract all files from .zip containing subfolders in one folder. I want all the files from subfolders extract in only one folder without keeping the original structure. At the moment, I extract all, move the files to a folder, then remove previous subfolders. The files with same names are overwrited.

Is it possible to do it before writing files?

Here is a structure for example:

my_zip/file1.txt my_zip/dir1/file2.txt my_zip/dir1/dir2/file3.txt my_zip/dir3/file4.txt 

At the end I whish this:

my_dir/file1.txt my_dir/file2.txt my_dir/file3.txt my_dir/file4.txt 

What can I add to this code ?

import zipfile my_dir = "D:\\Download\\" my_zip = "D:\\Download\\my_file.zip"  zip_file = zipfile.ZipFile(my_zip, 'r') for files in zip_file.namelist():     zip_file.extract(files, my_dir) zip_file.close() 

if I rename files path from zip_file.namelist(), I have this error:

KeyError: "There is no item named 'file2.txt' in the archive" 
like image 238
Thammas Avatar asked Feb 07 '11 00:02

Thammas


People also ask

What does ZipFile ZipFile do?

The ZIP file format is a common archive and compression standard. This module provides tools to create, read, write, append, and list a ZIP file.


1 Answers

This opens file handles of members of the zip archive, extracts the filename and copies it to a target file (that's how ZipFile.extract works, without taking care of subdirectories).

import os import shutil import zipfile  my_dir = r"D:\Download" my_zip = r"D:\Download\my_file.zip"  with zipfile.ZipFile(my_zip) as zip_file:     for member in zip_file.namelist():         filename = os.path.basename(member)         # skip directories         if not filename:             continue              # copy file (taken from zipfile's extract)         source = zip_file.open(member)         target = open(os.path.join(my_dir, filename), "wb")         with source, target:             shutil.copyfileobj(source, target) 
like image 182
Reiner Gerecke Avatar answered Oct 06 '22 01:10

Reiner Gerecke