2011-02-07 20 views
27

Tüm dosyaları bir klasörde .zip içeren alt klasörlerden ayıklamaya çalışıyorum. Alt klasörlerdeki tüm dosyaların, orijinal yapısını saklamadan sadece bir klasörde olmasını istiyorum. Şu anda hepsini ayıkla, dosyaları bir klasöre taşı, sonra önceki alt klasörleri kaldır. Aynı isimlere sahip dosyaların üzerine yazılmıştır.Yapıyı python ZipFile kullanarak tutmadan zip dosyaları ayıkla?

Dosya yazmadan önce bunu yapmak mümkün mü?

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

bu kodun neler katabilir: Bunu onun yanındaki sonunda

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

: Burada

bir örneğin yapıdır?

KeyError: "There is no item named 'file2.txt' in the archive" 

cevap

41

, f ayıklar ilename ve bir hedef dosyaya kopyalar (bu, alt dizinlere bakmadan ZipFile.extract'un nasıl çalıştığıdır).

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 = file(os.path.join(my_dir, filename), "wb") 
     with source, target: 
      shutil.copyfileobj(source, target) 
+0

Teşekkür ederim çalışıyor – Thammas

7

Onun yerine, kendini, bellekte bayt ayıklamak dosya adını hesaplamak ve orada yazmak: Ben dosyaları zip_file.namelist() dan yolunu adlandırmak eğer

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

, bu hatayı var kütüphaneyi icar bunu - insanın yaşadığı ülkeler -çoğunlukla, sadece yöntem ") (özü" yerine ") (okuma" kullanın:

Bu zip arşivinin üyelerinin dosya tanıtıcısı açar
import zipfile 
import os 

my_dir = "D:\\Download\\" 
my_zip = "D:\\Download\\my_file.zip" 

zip_file = zipfile.ZipFile(my_zip, 'r') 
for files in zip_file.namelist(): 
    data = zip_file.read(files, my_dir) 
    # I am almost shure zip represents directory separator 
    # char as "/" regardless of OS, but I don't have DOS or Windos here to test it 
    myfile_path = os.path.join(my_dir, files.split("/")[-1]) 
    myfile = open(myfile_path, "wb") 
    myfile.write(data) 
    myfile.close() 
zip_file.close() 
+0

teşekkürler. Sadece dizinimden korunmak için myfile_path dosyasında bir istisna ekleyelim ve sadece dosyaları saklamalısınız. – Thammas

2

O ZipFile.infolist() üzerinde yineleme mümkündür. Geri döndürülen ZipInfo nesnelerinde, dizin bölümünü kaldırmak ve son olarak belirtilen bir dizine çıkarmak için filename'u değiştirebilirsiniz.

import glob 
import zipfile 
import shutil 
import os 

my_dir = "D:\\Download\\" 
my_zip = "D:\\Download\\my_file.zip" 

with zipfile.ZipFile(my_zip) as zip: 
    for zip_info in zip.infolist(): 
     if zip_info.filename[-1] == '/': 
      continue 
     zip_info.filename = os.path.basename(zip_info.filename) 
     zip.extract(zip_info, my_dir) 
İlgili konular