2012-03-01 15 views
12

Büyük metin dosyalarını python ile sıkıştırmak istiyorum (20Gb dosyaları hakkında konuşuyorum). herhangi ben buldum bilgi toplamaya çalıştı böylece nasıl bir uzman değilim ve şu iş gibi görünüyor: Bu sözdizimi doğru olduğundan ve yolu varsa bunu optimize etmek olmadığını merak ediyorumPython ile büyük dosya sıkıştırma

import bz2 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel = 9) as output: 
     while True: 
      block = input.read(900000) 
       if not block: 
        break 
       output.write(block) 

input.close() 
output.close() 

? Burada bir şey kaçırdığımı hissettim.

Çok teşekkürler.

+2

sorunun ne yaşıyorsanız edilir? Çıktınız dosya doğru mu? – Daenyth

+1

Neden 900000 okumayı seçtiniz? – n1r3

+0

Evet, sıkıştırılmamış boyut karşılık geliyor ve biçim düzgün görünüyor. Kendi kendime python (ve genel olarak IT) öğrenmekte olduğum kodla ilgili her şeye güvenmiyorum. Teşekkürler. Evet bzip2 tarafından kullanılan parçaların boyutunu düşünmeyi seçerim, bir kerede bir kereyi daha iyi sıkıştırdığımı düşünürdüm, yanlış mı? – user1242959

cevap

17

Senaryonuz doğru görünüyor, ama kısaltılmış edilebilir:

from shutil import copyfileobj 

with open('bigInputfile.txt', 'rb') as input: 
    with bz2.BZ2File('bigInputfile.txt.bz2', 'wb', compresslevel=9) as output: 
     copyfileobj(input, output) 
+0

Teşekkürler! Öyleyse, yığın boyutlarının tanımı gerekli değil mi demek istiyorsun? – user1242959

+1

Yep. copyfileobj, varsayılan olarak 16 kb'lik bloklarla kopyalar; Üçüncü bir argüman ekleyerek eğer yığın boyutunu hala ayarlayabilirsiniz. –

+0

Evet, ancak işleri bunun gibi iyi! – user1242959

0

Neden .close() yöntemlerini çağırıyorsunuz? with: ifadesini kullandığınızda bunlar gerekmez.

+0

Bilmiyordum teşekkürler! – user1242959

+0

açık, örtük olmaktan iyidir: http://www.python.org/dev/peps/pep-0020/ –