2013-07-18 63 views
9

Tôi đang cố gắng trích xuất một tệp cụ thể từ kho lưu trữ zip bằng cách sử dụng python.Trích xuất một tệp cụ thể từ kho lưu trữ zip mà không cần duy trì cấu trúc thư mục trong python

Trong trường hợp này, hãy trích xuất biểu tượng của gói ứng dụng từ chính gói ứng dụng.

Tôi hiện đang sử dụng

ziphandle = open(tDir + mainapk[0],'rb') #`pwd`/temp/x.apk 
zip = zipfile.ZipFile(ziphandle) 
zip.extract(icon[1], tDir) # extract /res/drawable/icon.png from apk to `pwd`/temp/... 

mà không làm việc, trong thư mục script của tôi nhưng nó lại tạo temp/res/drawable/icon.png đó là tạm thời cộng với con đường tương tự như các tập tin nằm bên trong gói ứng dụng.

Điều tôi thực sự muốn là kết thúc bằng temp/icon.png.

Có cách nào thực hiện việc này trực tiếp bằng lệnh zip hay tôi cần trích xuất, sau đó di chuyển tệp, sau đó xóa các thư mục theo cách thủ công?

Trả lời

16

Bạn có thể sử dụng zipfile.ZipFile.read:

import os 

with zipfile.ZipFile(tDir + mainapk[0]) as z: 
    with open(os.path.join(tDir, os.path.basename(icon[1])), 'wb') as f: 
     f.write(z.read(icon[1])) 

Hoặc sử dụng zipfile.ZipFile.open:

import os 
import shutil 
with zipfile.ZipFile(tDir + mainapk[0]) as z: 
    with z.open(icon[1]) as zf, open(os.path.join(tDir, os.path.basename(icon[1])), 'wb') as f: 
     shutil.copyfileobj(zf, f) 
+0

Cả hai câu trả lời rất tốt đẹp, nhiều hùng hồn hơn là chỉ di chuyển nó như tôi. Chỉnh sửa nhỏ để phù hợp với câu hỏi được yêu cầu, là có mở (os.path.join (tDir, os.path.basename (biểu tượng [1])), 'wb') là f: để biểu tượng đầu ra nằm trong thư mục tạm thời, không cwd() trong đó tập lệnh là. Cảm ơn – o0rebelious0o