2014-12-05 11 views
5

Ich versuche, den Inhalt einer Textdatei zu lesen, die stdin über die Befehlszeile umgeleitet wurde, und es über das Internet zu senden, wenn der Empfänger es wieder zu seinem ursprünglichen Formular zusammenbauen muss.Eine Datei von umadressierter stdin mit Python lesen

Zum Beispiel:

$ python test.py < file.txt 

habe ich versucht, die Datei zu lesen und es wieder mit dem folgenden Code von link inspiriert zu montieren:

for line in sys.stdin: 
    stripped = line.strip() 
    if not stripped: break 
    result = result + stripped 

print "File is beeing copied" 
file = open("testResult.txt", "w") 
file.write(result) 
file.close() 
print "File copying is complete!" 

Aber diese Lösung funktioniert, solange ich DON 'T habe eine leere Zeile (zwei' \ n 'nacheinander) in meiner Datei, wenn ich habe, bricht meine Schleife und die Datei lesen endet.Wie kann ich von der Standardeingabe lesen, bis ich <> der Datei, die war umgeleitet?

+1

'file.write (sys.stdin.read())' –

Antwort

5

Warum suchen Sie selbst auf die Daten:

result = sys.stdin.read() 
+0

Danke! das ist genau das, was ich brauchte :) – user3717551

3

Anstatt zu brechen, wollen Sie nur continue in die nächste Zeile. Der Iterator stoppt automatisch, wenn er das Ende der Datei erreicht.

import sys 
result = "" 
for line in sys.stdin: 
    stripped = line.strip() 
    if not stripped: 
     continue 
    result += stripped 
+0

Dank für Ihre Antwort danken, löste es mein Problem. – user3717551

2

line.strip() wird das hintere Newline von der Leseleitung zu entfernen.

Wenn Sie diese Newline wollen, dann sollten Sie nicht tun müssen, dass ich nicht denke (hat Ihre Ausgabedatei die Eingabe Zeilenumbrüche)?

Das if stripped Bit sucht nach einer Leerzeile und war, im Original, die Terminierungseigenschaft der Schleife.

Das ist jedoch nicht Ihr Terminierungsmarker. Du willst nicht damit aufhören. Also nicht.

Die Schleife endet automatisch, wenn sys.stdin das Ende des Eingangs erreicht (EOF).

Tropfen line.strip() Tropfen if not stripped: break ersetzen result = result + stripped mit result = result + line und dann, dass eine einfach zu bekommen in die Datei schreiben (obwohl wahrscheinlich teuer) cp Skript.

Es gibt wahrscheinlich effizientere Möglichkeiten, alle Zeilen aus der Standardeingabe zu lesen, wenn Sie mit ihnen etwas machen wollen (abhängig von Ihrem Ziel).

+0

Ja, Sie haben Recht, ich das Strippen ist nicht notwendig (weil es den Text ändert es gelesen, und das ist nicht mein Ziel). Und tatsächlich schlägt "William Purpell" einen "effizienteren Weg" vor. – user3717551