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"
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With