2013-08-07 19 views
10

Python kullanarak anında gzipli bir metin dosyasına eklemek mümkün mü?Python Gzip - Dosyaya anında ekleme

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

Bir çizgi dosyasına her 6 saniyede bir (not "eklenmiş") ya da öylesine eklenir, ancak sonuç dosyası standart sıkıştırılmamış dosya olarak sadece büyük -:

Temelde bunu yapıyorum (tamamlandığında yaklaşık 1MB).

Sıkıştırma düzeyini açıkça belirtmek de bir fark yaratmıyor gibi görünüyor.

Mevcut bir sıkıştırılmamış dosyayı daha sonra gziplediysem, boyutu yaklaşık olarak 80kb'ye düşüyor.

Sanırım bir gzip dosyasına anında "eklemek" mümkün değil ve sıkıştırmak mümkün mü?

Bu, bir String.IO arabelleğine yazma işleminden sonra bittiğinde bir gzip dosyasına atılıyor mu?

+4

Gzip algoritmasının verimli çalışması için, sıkıştırılacak tüm içeriğin ellerine geçmesi gerekir. Aksi takdirde, yalnızca birbirinizle alakası olmayan gziplenmiş içerik parçaları ekliyorsunuz. – Nadh

+0

@Nadh Bu yüzden son satırım doğru mu? String.IO'ya yaz ve gzip'e akı? –

+1

Evet, işe yarayacak. Tüm içeriğin bir anda bir araya getirildiğinden emin olmanız gerekir. – Nadh

cevap

9

Gzip formatı, birleştirilmiş gzip akışlarına izin verdiği için geçerli bir gzip dosyası oluşturma ve koruma anlamında çalışır.

Bununla birlikte, her bir gzip sıkıştırması örneğini çok az veri ile çalışacağınız için, çok fazla sıkıştırma almanız anlamında çalışmaz. Sıkıştırma, önceki verilerin geçmişinden yararlanmaya bağlıdır, ancak burada gzip esasen hiç verilmemiştir.

a) Dosyaya başka bir gzip akışı eklemek için gzip'i çağırmadan önce en az birkaç K veri, satırlarınızın çoğunu biriktirebilir veya b) tek bir gzip akışına ekleyebilecek çok daha karmaşık bir şey yapabilirsiniz. Her defasında geçerli bir gzip akışı bırakarak ve verilerin verimli sıkıştırılmasına izin verir.

Bir b) örneğinin C, gzlog.h ve gzlog.c adreslerinde bulabilirsiniz. Python'un gzlog'u Python'da doğrudan uygulamak için gereken tüm zliblere sahip olduğuna inanmıyorum, fakat Python'dan C koduna bağlanabilirsiniz.