2017-12-18 15 views
-1

program1.py:Warum liest stdin zeilenweise statt Wort für Wort wie eine Zeichenfolge?

a = "this is a test" 
for x in a: 
    print(x) 

program2.py:

a = """this is a test 
     with more than one line 
     three, to be exact""" 
for x in a: 
    print(x) 

program3.py:

import sys 

for x in sys.stdin: 
    print(x) 

infile.txt:

Dies ist ein Test
mit mehreren Linien
genau das gleiche wie das zweite Beispiel
aber mit mehr Worten

Warum in einer separaten Zeile jedes Zeichen in der Zeichenfolge program1 und program2 beide ausgegeben haben, aber wenn wir cat infile.txt | python3 program3.py laufen, es gibt der Text Zeile für Zeile?

+2

weil 'sys.stdin' kein String ist - es ist eine spezielle Klasse, die konstruiert wurde, Zeile für Zeile zu lesen. – furas

+1

'sys.stdin' ist * kein' str' * -Objekt, es ist ein Dateiobjekt. –

Antwort

1

Beschreibung sys.stdin, von dem Python docs:

Datei-Objekte an den Interpreter Standard Eingabe, Ausgabe und Fehlerströme entsprechen.

Also sys.stdin ist ein Dateiobjekt, keine Zeichenfolge. Um zu sehen, wie der Iterator für File-Objekte arbeitet, schaut, wieder einmal, den Python docs:

Wenn eine Datei als Iterator verwendet wird, in der Regel in einem for-Schleife (zB für Zeile in f: print line.strip()) wird die next() -Methode wiederholt aufgerufen. Diese Methode gibt die nächste Eingabezeile oder wirft StopIteration wenn EOF getroffen wird, wenn die Datei zum Lesen geöffnet ist (Verhalten ist nicht definiert, wenn die Datei zum Schreiben geöffnet ist)

Also, der Iterator die nächste Eingabezeile ergibt bei jedem Aufruf anstelle der Zeichen-zu-Zeichen-Iteration, die bei Strings beobachtet wird.

-2

Da Daten in sys.stdin wie Array von Zeilen gespeichert ist, wenn Sie for x in sys.stdin ausführen, nimmt es nacheinander Zeilen ohne Zeichen. Um das zu tun, was wollen Sie dies versuchen:

for x in sys.stdin: 
    for y in x: 
     print(y) 
    print("") 
+2

'sys.stdin' speichert keine Daten in Zeilen. Dies hat nichts mit Speicherdetails zu tun. – user2357112

+0

Ich weiß, was ist stdin Ich schreibe das für erklären, wie stdin funktioniert ... –

2

sys.stdin ist ein Datei-Handle. Das Iterieren eines Datei-Handle erzeugt jeweils eine Zeile.

+0

Sie können dies ändern; https://stackoverflow.com/questions/25611796/how-to-read-in-one-character-at-a-time-from-a-file-in-python – tripleee

Verwandte Themen