2016-04-04 10 views
0

Aşağıdaki kod parçacığı bir gzip dosya tanıtıcısını açar ve ona bir satır yazar, daha sonra yeniden ekleme modunda açılır ve bir alt işlemin stdoutunu gzipli dosya tanıtıcısına yeniden yönlendirir.Python bağlantıları "gzip.open" dosyası için

import gzip 
import subprocess 

with gzip.open("./file.txt.gz", "w") as fh: 
    fh.write("this is the first line\n") 

with gzip.open("./file.txt.gz", "a") as fh: 
    subprocess.call("echo this is the second line", shell=True, stdout=fh) 

Ben kendisine yazdıklarını görmek için dosyayı açmak için çalıştığınızda, ben

$ gunzip file.txt.gz 
gzip: file.txt.gz: decompression OK, trailing garbage ignored 

sıkıştırılmış içeriği ilk satırda ibarettir aşağıdaki hatayı olsun

$ cat file.txt 
this is the first line 

Bir satır yazmak için ve bir işlemin çıktı olarak aynı dosya tanıtıcısını kullandığımda, gunzip tarafından bile tanınmayan bir dosya alıyorum.

import gzip 
import subprocess 

with gzip.open("./file.txt.gz", "w") as fh: 
    fh.write("this is the first line\n") 
    subprocess.call("echo this is the second line", shell=True, stdout=fh) 

Örneğin, gunzip d' olamaz bir dosya oluşturur.

$ gunzip file.txt.gz 

gzip: file.txt.gz: not in gzip format 

subprocess üzerinden bir süreç vadede bir gzip aromalı sözde dosya tanıtıcısından geçen bir yolu var mı yoksa gerçekten olmayan sıkıştırılmış dosya yazma ve sonra geri dönüyor ve onu sıkıştırarak için başka alternatif yok?

cevap

1

StackOverflow'ta arama yapıyorsanız, bu sorun zaman zaman ortaya çıkıyor, ancak yanıtlar her zaman uygulanamaz. Bunların özü, subprocess.call()'un bir sahte dosya el kitabını geçememesi gibi görünüyor - gerçek bir şey olmalı. Standart çözüm, subprocess.Popen() kullanıyor görünmektedir.

> gzcat file.txt.gz 
this is the first line 
this is the second line 
> 

subprocess.run() işlevi Python eklendi:

import gzip 
import subprocess 

with gzip.open("file.txt.gz", "wt") as handle: 
    handle.write("this is the first line\n") 

completed = subprocess.run("echo 'this is the second line'", shell=True, stdout=subprocess.PIPE, universal_newlines=True) 

with gzip.open("file.txt.gz", "at") as handle: 
    handle.write(completed.stdout) 

fikri alt işlemi tamamlandıktan sonra kadar sıkıştırılmış veri ekleme geciktirmek için geçerli:

Ancak, burada ben çalıştım basit uzlaşmadır 3.5