2013-08-07 57 views
10

Có thể nối thêm vào tệp văn bản được nén bằng cách sử dụng Python không?Python Gzip - Đính kèm tập tin khi đang bay

Về cơ bản tôi đang làm điều này: -

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'a', 9) 
f.write(content) 
f.close() 

Một dòng được nối (lưu ý "nối") để các tập tin định kỳ 6 giây hoặc lâu hơn, nhưng các tập tin kết quả là chỉ lớn như một file nén chuẩn (khoảng 1MB khi hoàn thành).

Xác định rõ ràng mức nén dường như không tạo nên sự khác biệt.

Nếu tôi gzip tệp nén không tồn tại sau đó, kích thước của nó sẽ giảm xuống còn khoảng 80kb.

Tôi đoán rằng không thể "nối thêm" vào tệp gzip khi đang di chuyển và có nén không?

Đây có phải là trường hợp ghi vào bộ đệm String.IO và sau đó chuyển sang tệp gzip khi hoàn tất không?

+4

Để thuật toán gzip hoạt động hiệu quả, nó phải có được toàn bộ nội dung được nén. Nếu không, bạn chỉ cần thêm khối nội dung bị nén mà không liên quan gì đến nhau. – Nadh

+0

@Nadh vì vậy tôi đoán dòng cuối cùng của tôi là chính xác? Viết thư cho một String.IO và chuyển sang gzip? –

+1

Có, điều đó sẽ hiệu quả. Bạn chỉ cần đảm bảo rằng tất cả nội dung được gzipped cùng nhau bất kỳ lúc nào. – Nadh

Trả lời

9

Điều đó hoạt động theo ý nghĩa tạo và duy trì tệp gzip hợp lệ, vì định dạng gzip cho phép các luồng gzip được ghép nối.

Tuy nhiên, nó không hoạt động theo nghĩa là bạn bị nén nặng, vì bạn đang đưa ra từng trường hợp nén gzip để ít dữ liệu hoạt động. Nén phụ thuộc vào việc tận dụng lịch sử của dữ liệu trước đó, nhưng ở đây gzip đã được đưa ra về cơ bản không có.

Bạn có thể a) tích lũy ít nhất một vài K dữ liệu, nhiều dòng của bạn trước khi gọi gzip để thêm luồng gzip khác vào tệp hoặc b) thực hiện điều gì đó phức tạp hơn. , để lại luồng gzip hợp lệ mỗi lần và cho phép nén dữ liệu hiệu quả.

Bạn tìm thấy ví dụ về b) trong C, trong gzlog.hgzlog.c. Tôi không tin rằng Python có tất cả các giao diện để zlib cần thiết để thực hiện gzlog trực tiếp trong Python, nhưng bạn có thể giao tiếp với mã C từ Python.

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