Wat leest sys.stdin?

Ik begrijp hoe ik bestanden moet openen en vervolgens de vooraf ingebouwde functies van Python ermee kan gebruiken. Maar hoe werkt sys.stdin?

for something in sys.stdin:
    some stuff here
lines = sys.stdin.readlines()

Wat is het verschil tussen de twee bovengenoemde toepassingen op sys.stdin? Waar leest hij de informatie vandaan? Is het via het toetsenbord, of moeten we nog een bestand aanleveren?


Antwoord 1, autoriteit 100%

Dus je hebt de “vooraf ingebouwde functies” van Python gebruikt, vermoedelijk als volgt:

file_object = open('filename')
for something in file_object:
    some stuff here

Dit leest het bestand door een iteratorop het bestandsobject aan te roepen die toevallig de volgende regel uit het bestand retourneert.

Je zou in plaats daarvan kunnen gebruiken:

file_object = open('filename')
lines = file_object.readlines()

die de regels van de huidige bestandspositie in een lijst leest.

Nu is sys.stdingewoon een ander bestandsobject, dat toevallig door Python wordt geopend voordat je programma start. Wat je met dat bestandsobject doet, is aan jou, maar het is niet echt anders dan enig ander bestandsobject, je hebt alleen geen opennodig.

for something in sys.stdin:
    some stuff here

zal de standaardinvoer herhalen totdat het einde van het bestand is bereikt. En dit geldt ook voor:

lines = sys.stdin.readlines()

Je eerste vraag gaat eigenlijk over verschillende manieren om een bestandsobject te gebruiken.

Ten tweede, waar leest het vandaan? Het leest van bestandsdescriptor 0 (nul). Op Windows is dit bestandshandle 0 (nul). Bestandsdescriptor/handle 0 is standaard verbonden met de console of tty, dus in feite leest het vanaf het toetsenbord. Het kan echter omgeleid worden, vaak door een shell (zoals bash of cmd.exe) met de volgende syntaxis:

myprog.py < input_file.txt 

Dat verandert bestandsdescriptor nul om een bestand te lezen in plaats van het toetsenbord. Op UNIX of Linux gebruikt dit de onderliggende aanroep dup2(). Lees je shell-documentatie voor meer informatie over omleiding (of misschien man dup2als je dapper bent).


Antwoord 2, autoriteit 28%

Het leest van de standaardinvoer– en het zou door het toetsenbord moeten worden geleverd in de vorm van streamgegevens.

Het is niet verplicht om een bestand aan te leveren, maar u kunt wel omleidinggebruiken om gebruik een bestand als standaardinvoer.

In Python leest de readlines()-methode de hele streamen splitst deze vervolgens op bij het newline-tekenen maakt een lijst van elke regel.

lines = sys.stdin.readlines()

Het bovenstaande creëert een lijst met de naam regels, waarbij elk element een regel zal zijn (zoals bepaald door het einde van de regel-teken).

Je kunt hier meer over lezen in het invoer- en uitvoergedeeltevan de Python-zelfstudie.

Als u de gebruiker om invoer wilt vragen, gebruikt u de methode input()(gebruik in Python 2 raw_input()) :

user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))

Antwoord 3, autoriteit 16%

Om een idee te krijgen hoe sys.stdin werkt, doe je het volgende:

maak een eenvoudig python-script, laten we het “readStdin.py” noemen:

import sys
lines = sys.stdin.readlines()
print (lines)

Open nu console elk type in:

echo "line1 line2 line3" | python readStdin.py

Het script geeft het volgende weer:

['"line1 line2 line3" \n']

Dus, het script heeft de invoer in de lijst (genaamd ‘lijnen’) gelezen, inclusief het nieuwe regelteken geproduceerd door ‘echo’. Dat wil zeggen.


Antwoord 4, autoriteit 12%

Volgens mij accepteert de methode sys.stdin.read() een regel als invoer van de gebruiker tot een speciaal teken zoals Enter-toets en gevolgd door Ctrl + D en slaat de invoer vervolgens op als de tekenreeks.

Control + D werkt als het stopsignaal.

Voorbeeld:

import sys
input = sys.stdin.read()
print(input)
tokens = input.split()
a = int(tokens[0])
b = int(tokens[1])
print(a + b)

Voer na het uitvoeren van het programma twee getallen in, gescheiden door een spatie en druk na afloop één of twee keer op Control + D en u wordt weergegeven door de som van de twee invoer.


Antwoord 5, autoriteit 8%

for something in sys.stdin:
    some stuff here

De bovenstaande code werkt niet zoals je verwacht omdat sys.stdineen bestandsingang is – het is een bestandsingang naar de stdin. Het zal de regel some stuff hereniet bereiken

lines = sys.stdin.readlines()

Als het bovenstaande script in een interactieve shell wordt uitgevoerd, blokkeert het de uitvoering totdat een gebruiker op Ctrl-D drukt, wat het einde van de invoer aangeeft.

Other episodes