2012-02-24 70 views
47

Đây là mã tôi hiện đang sử dụng để trích xuất tệp zip nằm trong cùng thư mục làm việc hiện tại làm tập lệnh. Làm cách nào tôi có thể chỉ định một thư mục khác để trích xuất?Trích xuất nội dung tệp zip vào thư mục cụ thể trong Python 2.7

Mã tôi đã thử không giải nén nó ở nơi tôi muốn.

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open(name, 'wb') 
    outfile.write('C:\\'+z.read(name)) 
    outfile.close() 
fh.close() 
+1

Bạn có nên di chuyển 'C: \\' + sang cuộc gọi mở thay vì cuộc gọi viết không? –

Trả lời

96

Tôi nghĩ bạn vừa có một bản mix ở đây. có lẽ nên được một cái gì đó như sau:

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outpath = "C:\\" 
    z.extract(name, outpath) 
fh.close() 

và nếu bạn chỉ muốn trích xuất tất cả các tập tin:

import zipfile 

with zipfile.ZipFile('test.zip', "r") as z: 
    z.extractall("C:\\") 
+0

ZipFile không có thuộc tính '__exit__' vì vậy tôi không biết câu lệnh của bạn sẽ hoạt động như thế nào. – adam

+0

Nếu bạn tạo một cá thể 'ZipFile', nó có phương thức' __exit__'. Tôi vừa thử ví dụ khác (python 2.7) và nó hoạt động như được viết. – secretmike

+0

Python 2.6 có triển khai khác nhau của ZipFile vì một số lý do. – adam

2

Peter de Rivaz có điểm trong nhận xét ở trên. Bạn sẽ muốn có thư mục trong lời gọi để mở(). Bạn sẽ muốn thực hiện một việc như sau:

import zipfile 
import os 

os.mkdir('outdir') 
fh = open('test.zip','rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open('outdir'+'/'+name, 'wb') 
    outfile.write() 
    outfile.close() 
fh.close() 
10

Tôi đã thử các câu trả lời khác trong chủ đề này, nhưng giải pháp cuối cùng đối với tôi chỉ đơn giản là :

zfile = zipfile.ZipFile('filename.zip') 
zfile.extractall(optional_target_folder) 

Nhìn vào extractall, nhưng sử dụng nó chỉ với các tập tin zip đáng tin cậy.

+2

Tôi đề nghị gọi 'zfile.close()', quá, như nó nói trong [ZipFile.close] (https://docs.python.org/2/library/zipfile.html#zipfile .ZipFile.close) ** Bạn phải gọi close() trước khi thoát khỏi chương trình của bạn hoặc các bản ghi cần thiết sẽ không được viết. **. – erwaman

0

Tôi đã sửa đổi mã để hỏi người dùng đầu vào tên tập tin và đường đi của nó, nơi nó cần phải được tách ra và vì vậy người dùng will've kiểm soát nhiều hơn về nơi để đặt các thư mục trích ra và những gì tên nên được gán cho thư mục được trích xuất.

import zipfile 

#picking zip file from the directory 
ZipFileName = raw_input("Enter full path to zip file:") 
fh = open(ZipFileName , 'rb') 
z = zipfile.ZipFile(fh) 

#assigning a name to the extracted zip folder 
DestZipFolderName = raw_input("Assign destination folder a name: ") 
DestPathName = raw_input("Enter destination directory: ") 
DestPath = DestPathName + "\\" + DestZipFolderName 

for name in z.namelist(): 
    outpath = DestPath 
    z.extract(name, outpath) 
fh.close() 
4

Thêm vào câu trả lời bí mật ở trên với hỗ trợ cho python 2.6 để giải nén tất cả các tệp.

import zipfile 
import contextlib 


with contextlib.closing(zipfile.ZipFile('test.zip', "r")) as z: 
    z.extractall("C:\\") 
3

Nếu bạn chỉ muốn trích xuất một file zip từ dòng lệnh sử dụng Python (nói bởi vì bạn không có lệnh giải nén có sẵn), sau đó bạn có thể gọi các module zipfile trực tiếp

python -m zipfile -e monty.zip target-dir/ 

Hãy xem docs. Nó cũng hỗ trợ nén và liệt kê các nội dung.

Các vấn đề liên quan