2013-08-07 17 views
10

Czy można w dowolnym momencie dołączyć do spakowanego pliku tekstowego za pomocą Pythona?Python Gzip - Dołączanie do pliku w locie

zasadzie robię to: -

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

Linia jest dołączany (nota „dołączony”) do pliku co 6 sekund lub tak, ale plik wynikowy jest tak duża, jak standardowy plik nieskompresowany (około 1 MB po zakończeniu).

Jawnie określenie poziomu kompresji również nie ma znaczenia.

Gdybym gzip istniejący plik nieskompresowany potem, to wielkość sprowadza się z grubsza 80kb.

Czy zgaduję, że nie jest możliwe "dołączenie" do pliku gzip w locie i skompresowanie go?

Czy to przypadek piśmie do bufora String.IO a następnie spłukiwania do pliku gzip kiedy zrobić?

+4

Aby algorytm gzip działał sprawnie, musi dostać się w ręce całej skompresowanej treści. W przeciwnym razie dodajesz tylko fragmenty spakowanych treści, które nie mają ze sobą nic wspólnego. – Nadh

+0

@Nadh, więc domyślam się, że moja ostatnia linia jest poprawna? Napisz do String.IO i spłucz do gzip? –

+1

Tak, to powinno zadziałać. Musisz tylko upewnić się, że cała zawartość jest zgrupowana razem w dowolnej chwili. – Nadh

Odpowiedz

9

To działa w sensie tworzenia i utrzymywania prawidłowego pliku gzip, ponieważ format gzip pozwala konkatenowanych strumienie gzip.

Jednak to nie działa w tym sensie, że masz kiepską kompresję, ponieważ dajesz każdej instancji kompresji gzip tak mało danych, aby pracować. Kompresja zależy od wykorzystania historii poprzednich danych, ale tutaj gzip zasadniczo nie został podany.

Możesz albo a) zgromadzić co najmniej kilka K danych, wiele linii, zanim wywołasz gzip, aby dodać kolejny plik gzip do pliku, lub b) zrobisz coś znacznie bardziej wyrafinowanego, które dołącza do pojedynczego strumienia gzip , pozostawiając prawidłowy strumień gzip za każdym razem i pozwalając na wydajną kompresję danych.

Znajdziesz przykład b) w C, w gzlog.h i gzlog.c. Nie wierzę, że Python ma wszystkie interfejsy do zlib potrzebne do implementacji gzlog bezpośrednio w Pythonie, ale można by było połączyć się z kodem C z Pythona.