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!


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 .


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

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 .


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.