Membongkar file dalam Python

Jawaban:

787
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

Cukup banyak!

Rahul
sumber
7
bagaimana jika isi arsip .zip sama, di semua arsip .zip? cara mengganti nama konten sebelum mengekstraksi? contoh: 1.zip 2.zip .. semua mengandung content.txt: ekstrak semua seperti 1content.txt 2content.txt?
iratzhash
8
@iratzhash Saya biasanya membuat direktori sementara baru untuk konten menggunakan tempfile: docs.python.org/3/library/tempfile.html Saya unzip ke direktori sementara dan memindahkan / mengatur file dari sana.
Dave Forgac
8
@ 3kstc saya akan from zipfile import ZipFile. Saat menggunakannya, Anda tidak perlu lagi menggunakan zipfile.ZipFile, dan bisa menggunakannya ZipFile(zip_file_name).
Debug255
@iratzhash Saya menyadari Anda berkomentar 1,5 tahun yang lalu. Tapi supaya orang lain tahu, biasanya isi dalam file zip adalah read-only. Jawaban yang bagus ada di sini oleh "bouke"
Debug255
Semacam catatan meta, tetapi hasil edit dari November 2018 membuat ini cukup identik dengan jawaban lain yang sudah menggunakan manajer konteks (dan tautan ke apa artinya itu).
Engineero
304

Jika Anda menggunakan Python 3.2 atau yang lebih baru:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

Anda tidak perlu menggunakan tutup atau mencoba / menangkap dengan ini karena menggunakan konstruksi manajer konteks .

pengguna1741137
sumber
18
ZipFile juga berfungsi sebagai manajer konteks di 2.7 atau yang lebih baru: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
FelixEnescu
Bagaimana cara berurusan dengan pengecualian docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? Secara umum, apa praktik terbaik untuk menggunakan try / kecuali dengan manajer konteks (dengan-pernyataan)?
SnowOnion
1
zipfile+ pathlib= menang. keberatan jika saya sedikit memperbarui jawaban Anda?
Datanovice
38

Gunakan extractallmetode ini, jika Anda menggunakan Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()
Dan Breen
sumber
Tidakkah Anda harus menentukan tujuan (zip.extractall (tujuan))?
asonnenschein
3
Tidak jika Anda hanya mengekstraksi ke direktori yang sama dengan zipfile
Dan Gayle
10
@DanGayle ini tampaknya mengekstraksi file zip ke direktori kerja saat ini, BUKAN lokasi file zip
Brian Leishman
4
bagi saya, ZipFile () tidak berfungsi selain zipfile.ZipFile () berhasil - setelah mengimpor zipfile
Agile Bean
6

Anda juga hanya dapat mengimpor ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Bekerja di Python 2 dan Python 3 .

simhumileco
sumber
1
Terima kasih atas perhatian Anda @MylesHollowed Namun, ini bukan salinan dari jawaban yang diterima. Saya setuju bahwa mereka mirip satu sama lain, tetapi mereka berbeda. Ini juga ditunjukkan oleh komentar Anda, karena yang diterima jelas lebih baik untuk Anda daripada saya. Jika itu adalah salinan, itu akan sama ... Untuk seseorang, jawaban saya mungkin berharga karena mungkin lebih mudah dibaca dan ketika Anda perhatikan mengimpor lebih sedikit kode ... Karena perbedaan-perbedaan inilah saya memutuskan untuk memberikan jawaban saya untuk memberikan alternatif. Bukankah itu sebabnya kita bisa memberikan jawaban lain setelah menerimanya? Semua yang terbaik
simhumileco
Apa yang salah dengan jawaban ini? Mengapa seseorang memberinya poin negatif? Bagaimanapun, itu adalah jawaban untuk pertanyaan dan dibedakan oleh kesederhanaannya dibandingkan dengan jawaban lain, yang mungkin penting bagi beberapa orang yang mencari jawaban. Bukan?
simhumileco
1
@MylesHollowed import zipfile.ZipFilemenghasilkan ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packagedalam 3.6.5. Saya terbuka untuk itu karena kesalahan operator pada bagian saya, tetapi saya tidak tahu apa itu.
MikeF
6

coba ini :


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

path: path file unzip

Selesai Jin
sumber
3
import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

Ini tidak mengandung validasi untuk file jika itu bukan zip. Jika folder tersebut berisi file bukan .zip, folder itu akan gagal.

pengguna3911901
sumber