Mai mult
Cum ai citit de la intrarea standard?
Am'm încercarea de a face unele de cod de golf provocări, dar toate acestea necesită o intrare să fie luate de la stdin`. Cum a face I a lua că în Python?
1378
22
Ai putea folosi
fileinput
modulul:fileinput
va bucla prin toate liniile de intrare specificat ca nume de fișier dat în argumente în linia de comandă, sau standard de intrare dacă nu argumentele sunt furnizate.Notă: "de linie" va conține un trailing newline; să scoateți-l folosesc linie.rstrip()`
Nu's câteva modalități de a face asta.
sys.stdin
este un fișier obiect pe care puteți apela funcții de citire " sau " readlines dacă doriți să citiți totul sau doriți să citiți totul și să-l împartă prin newline automat. (Trebuie săimport sys
pentru ca aceasta să funcționeze.)Dacă vrei să prompt utilizatorul pentru intrare, puteți utiliza
raw_input
în Python 2.X, și doarinput
în Python 3.Dacă tu de fapt vrei doar să citești opțiuni de linie de comandă, le puteți accesa prin intermediul sys.argv lista.
Veți găsi, probabil, acest Wikibook articolul pe I/O în Python pentru a fi o referință utilă, precum și.
``pyton import sys
pentru linia în sys.stdin: print(linie) ``
Rețineți că acest lucru va include un caracter newline la sfarsit. Pentru a elimina newline la sfarsit, foloseste-line.rstrip()` ca @brittohalloran spus.
Python are, de asemenea, built-in functii
input () " și " raw_input()
. Vezi Python documentație sub Built-in Functii.De exemplu,
sau
Aici's de Învățare Python:
Pe Unix, ai putea încercare de a face ceva de genul:
Pe Windows sau DOS, ai'd face:
Răspunsul propus de către alții:
este foarte simplu și pythonic, dar trebuie să se constate că script-ul va aștepta până când EOF înainte de a începe pentru a repeta pe liniile de intrare.
Acest lucru înseamnă că
tail-f error_log | myscript.py
nu va procesa liniile cum era de așteptat.Scriptul corect pentru un astfel de caz de utilizare ar fi:
UPDATE Din comentarii s-a lămurit că pe pitonul 2 numai acolo ar putea fi tamponare implicate, astfel încât să se încheie în așteptare pentru tampon pentru a umple sau EOF înainte de imprimare apel este emis.
Putem vedea că
sys.stdin
este în mod implicit modul text: ``pythonMai răspunde
Aici's-o complet, ușor de reprodus, demo, folosind două metode, în funcție nativă, "intrare" (folosesc raw_input în Python 2),
sys.stdin
. Datele sunt nemodificate, deci prelucrarea este un non-operare. Pentru a începe cu, las's a crea un fișier pentru intrări:Și folosind codul de ne'am văzut deja, putem verifica faptul că ne-am'am creat fișierul:
Aici's a ajuta pe `sys.stdin.citesc de Python 3:
Interna functia de "intrare" (`raw_input în Python 2)
Interna funcția de "intrare" se citește de la intrarea standard până la o linie nouă, care este deposedat (completând "imprimare", care adaugă o linie nouă în mod implicit.) Acest lucru se întâmplă până când acesta devine EOF (Sfârșit De Fișier), moment în care se ridică
EOFError
. Astfel, aici's cum puteți folosi "intrare" în Python 3 (sau `raw_input în Python 2) pentru a citi de la intrarea standard - deci, vom crea un modul Python numim stdindemo.py:Și să's de imprimare înapoi pentru a se asigura că's cum ne asteptam:
Din nou, "intrare" citește până la newline și, în esență, benzi de linie. "imprimare" adaugă o linie nouă. Deci, în timp ce amândoi modifica intrare, modificările lor anula. (Astfel încât acestea sunt, în esență, reciproc's complement.) Și atunci când "input" devine end-of-file de caracter, se ridică EOFError, care ne ignora și apoi de ieșire din program. Și pe Linux/Unix, putem conducta de pisica:
Sau putem redirecționa fișierul de la stdin:
Putem executa, de asemenea, la modul ca un script:
Aici's a ajuta pe comanda interna "intrare" la Python 3:
sys.stdin
Aici vom face un script demo folosind
sys.stdin
. Eficient mod de a itera peste un fișier obiect este de a folosi file-ca obiect, ca un iterator. Complementar metoda de a scrie la stdout de la această intrare este de a folosi pur și simplu `sys.stdout.scrie:Imprimați-l înapoi pentru a vă asigura că arată bine:
Și redirecționarea intrărilor în fișier:
Jucăm într-o comandă:
Descriptorii de fișier pentru Golf
Deoarece descriptorii de fișier pentru stdin " și "stdout` sunt 0 și 1, respectiv, putem trece, de asemenea, cei de la "open" în Python 3 (nu 2, și rețineți că avem nevoie în continuare de 'g' pentru a scrie la stdout). Dacă acesta funcționează pe sistemul dumneavoastră, acesta va rade de pe mai multe caractere.
Python 2's
io.deschide
face asta la fel de bine, dar de import nevoie de mai mult spațiu:Pentru a aborda alte comentarii și răspunsuri
Un comentariu sugerează
''.alăturați-vă(sys.stdin) pentru golf dar care's, de fapt, mai mult decât sys.stdin.read() - plus Python trebuie să creeze un plus de listă în memorie (ca'cum s
str.alături de lucrări atunci când nu a dat o listă) - pentru contrast:Răspunsul de sus sugerează:
Dar, din
sys.stdin
implementează fișierul API, inclusiv iterator protocol, care's la fel ca asta:Un alt răspuns nu sugera acest lucru. Doar amintiți-vă că, dacă o faci într-un interpret, ai'll nevoie pentru a face Ctrl-: d daca're pe Linux sau Mac, sau Ctrl-z pe Windows (după Enter) pentru a trimite end-of-file caracter la proces. De asemenea, acest răspuns sugerează
print(linie)
- care adaugă un'\n' la final
print(linie, end='')în loc (în cazul în Python 2,'ll nevoie de __viitoarele__ import print_function
). Adevărata caz de utilizare pentru fileinput` este pentru lectură într-o serie de fișiere.Acest lucru va echo intrarea standard la ieșirea standard:
Clădirea de pe toate anwers folosind `sys.stdin, puteți face, de asemenea, ceva de genul următor pentru a citi de la un argument de fișier dacă cel puțin un argument există, și cad înapoi la stdin altfel:
și de a folosi ca nici
sau
sau chiar
Asta ar face Python script-ul se comporta la fel ca multe GNU/Unix programe, cum ar fi "pisică",
grep
șised
.argparse
este o soluție ușorExemplu compatibil cu versiunile Python 2 și 3:
Puteți rula acest script în mai multe moduri:
1. Folosind
stdin
sau mai scurte prin înlocuirea "echo", de aici string:
Următoarele chip de cod vă va ajuta să (se va citi toate stdin blocarea către
EOF
, într-un singur șir de caractere):Încercați acest lucru:
și verificați-l cu:
Puteți citi de la intrarea standard și apoi depozitați-intrări în "de date" după cum urmează:
Citiți din sys.stdin, dar la citește date binare pe Windows, trebuie să fie foarte atenți, pentru că
sys.stdin
nu este deschis în mod text și nu va corupt\r\n
înlocuirea lor cu\n
.Soluția este de a stabili modul în binar dacă Windows + Python 2 este detectat, și pe Python 3 utilizarea
sys.stdin.buffer
.Sunt destul de uimit nimeni nu a menționat acest hack de până acum:
compatibil atât cu python2 și python3
Problema pe care o am cu soluție
este că, dacă nu't trece orice date de la intrarea standard, se va bloca pentru totdeauna. Ca's de ce-mi place acest răspuns: verificați dacă există unele date de pe stdin în primul rând, și apoi a citit-o. Aceasta este ceea ce am ajuns să fac:
Am avut unele probleme atunci când obtinerea de acest lucru pentru lectură peste prize adus la ea. Atunci când priza a fost închis, a început revenirea șir gol într-un activ curent. Deci, aceasta este soluția mea la aceasta (pe care am testat doar in linux, dar sper că funcționează în toate celelalte sisteme)
Deci, dacă începi să asculți pe un soclu se va lucra în mod corespunzător (de exemplu, în bash):
Și puteți apela cu telnet sau doar punct un browser pentru a localhost:12345
Cu privire la acest lucru:
pentru linie în sys.stdin:
Am încercat pe python 2.7 (următoarele altcineva's sugestie) pentru un fișier foarte mare, și eu nu't-l recomand, tocmai pentru motivele menționate mai sus (nimic nu se întâmplă pentru o lungă perioadă de timp).
Am ajuns cu puțin mai pythonic soluție (și funcționează pe fișiere mai mari):
Atunci pot rula script-ul local ca:
Pentru Python 3 ar fi:
Aceasta este de fapt o formă simplă de pisica(1), de't a adăuga o linie nouă după fiecare linie. Puteți folosi acest lucru (dupa ce a marcat fișier executabil folosind
chmod +x cat.py
cum ar fi:Există
os.citit(0, x)
care citește xbytes de la 0, care reprezintă stdin. Aceasta este o unbuffered citit, mai scăzut nivel decât sys.stdin.read()