2009-06-08 23 views
6

Có cách nào để tôi có thể nén nội dung được tạo theo kiểu động, chẳng hạn như mẫu html mới được hiển thị, vào tệp zip bằng zipfile không?Nén tệp động trong Máy ứng dụng (Python)

Dường như có một số ví dụ xung quanh để nén nội dung tĩnh, nhưng không có ví dụ nào cho việc nén nội dung động. Hoặc, là nó không thể ở tất cả?

Một câu hỏi nữa: Có thể tạo tệp zip với một loạt các thư mục con bên trong nó không?

Cảm ơn.

Trả lời

7

Bạn có thể thêm bất cứ điều gì bạn muốn một file zip bằng ZipFile.writestr():

my_data = "<html><body><p>Hello, world!</p></body></html>" 
z.writestr("hello.html", my_data) 

Bạn cũng có thể sử dụng các thư mục con bằng / (hoặc os.sep) như là một dấu phân cách:

z.writestr("site/foo/hello/index.html", my_data) 
+0

Các bạn rock! Cảm ơn rất nhiều. – checker659

3

Ngoài với câu trả lời tuyệt vời của Schnouki, bạn cũng có thể truyền ZipFile một đối tượng giống như tệp, chẳng hạn như một đối tượng được tạo bởi StringIO.StringIO.

+0

Cảm ơn Ryan! _ – checker659

+0

Nếu bạn đang sử dụng Python 3, nó cần phải là io.BytesIO (mô-đun StringIO đã biến mất và zipfile mong đợi một bộ đệm byte) –

+1

Rất tiếc, chỉ nhận ra rằng đây là về App Engine. Bạn có lẽ nên bỏ qua bình luận cuối cùng của tôi :), xin lỗi. –

14

Mã làm việc: (đối với động cơ ứng dụng :)

output = StringIO.StringIO() 
z = zipfile.ZipFile(output,'w') 
my_data = "<html><body><p>Hello, world!</p></body></html>" 
z.writestr("hello.html", my_data) 
z.close() 

self.response.headers["Content-Type"] = "multipart/x-zip" 
self.response.headers['Content-Disposition'] = "attachment; filename=test.zip" 
self.response.out.write(output.getvalue()) 

Cảm ơn một lần nữa để Schnouki và Ryan.

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