Ich habe ein ziemlich einfaches Problem. Ich habe eine große Datei, die drei Schritte durchläuft, einen Decodierschritt, der ein externes Programm verwendet, etwas, das in Python verarbeitet wird, und dann mit einem anderen externen Programm umcodiere. Ich habe subprocess.Popen() verwendet, um dies in Python zu tun, anstatt Unix-Pipes zu bilden. Alle Daten werden jedoch im Arbeitsspeicher gepuffert. Gibt es eine pythonische Art, diese Aufgabe zu erledigen, oder sollte ich am besten auf ein einfaches Python-Skript zurückkommen, das von stdin liest und mit Unix-Pipes auf beiden Seiten nach stdout schreibt?Sehr große Eingabe und Verrohrung mit subprocess.Popen
import os, sys, subprocess
def main(infile,reflist):
print infile,reflist
samtoolsin = subprocess.Popen(["samtools","view",infile],
stdout=subprocess.PIPE,bufsize=1)
samtoolsout = subprocess.Popen(["samtools","import",reflist,"-",
infile+".tmp"],stdin=subprocess.PIPE,bufsize=1)
for line in samtoolsin.stdout.read():
if(line.startswith("@")):
samtoolsout.stdin.write(line)
else:
linesplit = line.split("\t")
if(linesplit[10]=="*"):
linesplit[9]="*"
samtoolsout.stdin.write("\t".join(linesplit))
Was ist * eine große Datei *? – eumiro
Gute Frage. Größer als verfügbarer RAM. – seandavi
Dummer Fehler meinerseits. Ich habe die read() -Methode in der obigen for-Schleife verwendet. Die korrigierte Zeile sollte natürlich nicht die Datei .read() haben, da amtools.stdout eigentlich ein dateiähnliches Objekt ist. – seandavi