2010-08-23 20 views
6

Geçici dosyalar oluşturmaya gerek kalmadan Python'daki bir metin dosyasının üzerine indirmek, yinelemek ve yinelemek istiyorum.Python'da bir gzip dosyasını indirin, ayıklayın ve okuyun

temelde

, bu boru, ancak Python

İşte
curl ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz | gunzip | processing step 

kodum var: Ben bu senaryo istiyorum çünkü process.Popen() ya da bir şey kullanmak istemiyorum

def main(): 
    import urllib 
    import gzip 

    # Download SEED database 
    print 'Downloading SEED Database' 
    handle = urllib.urlopen('ftp://ftp.theseed.org/genomes/SEED/SEED.fasta.gz') 


    with open('SEED.fasta.gz', 'wb') as out: 
     while True: 
      data = handle.read(1024) 
      if len(data) == 0: break 
      out.write(data) 

    # Extract SEED database 
    handle = gzip.open('SEED.fasta.gz') 
    with open('SEED.fasta', 'w') as out: 
     for line in handle: 
      out.write(line) 

    # Filter SEED database 
    pass 

platform bağımsız olmak

Sorun, Gzip kitaplığının yalnızca dosya adlarını yalnızca argüman olarak kabul ettiği ve tanıtıcıları kabul etmediğidir. "Borulama" nedeni, indirme adımının sadece% 5 kadar CPU kullanması ve ekstraksiyonu ve işlemeyi aynı anda yürütmesi daha hızlı olacaktır.


DÜZENLEME: Çünkü yolu gzip sıkıştırma eser

", GzipFile onun konumunu kaydetmek ve sıkıştırılmış yoluyla geriye ileriye taşımak ve gerektiğinden Bu işe yaramaz "Dosya", bir uzaktan sunucusundan gelen bir bayt akışı olduğunda bu işe yaramaz; tüm yapmanız gereken retri Eve bayt bir seferde, veri akışı aracılığıyla ileri geri hareket ettirin. " - dive into python Ben hatayı

AttributeError: addinfourl instance has no attribute 'tell' 

Yani nasıl oluyor curl url | gunzip | whatever iş bulmak neden

?

+1

Neden bu ayrı Python dosyalarında değil? python indir.py | python extract.py | python filter.py'? –

+0

Python komut dosyalarının sistem komutlarından python komut dosyalarından yürütülmesi dağınık olduğu için. Ayrıca, bunun platformdan bağımsız olmasını (Windows kullanan kişilerde herhangi bir problem yaşanmayacağını) ve sistem komutlarını çalıştırmanın bunu zorlaştırdığını söyledim. DOS bile boru tesisatını destekliyor mu? –

cevap

9

Sadece gzip.GzipFile(fileobj=handle) ve yolunuza devam edeceksiniz - başka bir deyişle, "Gzip kitaplığı yalnızca argüman olarak değil, dosya tanıtıcılarını kabul eder" doğru değildir, sadece fileobj= isimli argümanı kullanmalısınız.

+0

Teşekkürler! Bunu Docu'da görmedim. –

+0

@Austin, rica ederim! –

+1

Dosya nesnesinin "seek" işlevini desteklemesi gerektiğini unutmayın. – Andrey

İlgili konular