2014-12-05 14 views
5

Sto cercando di leggere il contenuto di un file di testo che è stato reindirizzato con stdin tramite la riga di comando e di inviarlo da Internet quando il ricevitore deve riunirlo nella sua forma originale.Lettura di un file dallo stdin reindirizzato con python

Per esempio:

$ python test.py < file.txt 

ho cercato di leggere il file e da assemblare indietro con il seguente codice ispirato link:

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!" 

Ma questa soluzione funziona finché io DON 'Ho una riga vuota (due' \ n 'uno dopo l'altro) nel mio file, se ce l'ho, il mio ciclo si interrompe e il File sta leggendo. Come posso leggere da stdin fino a raggiungere <> del file che era reindirizzato?

+1

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

risposta

5

Perché sei anche guardando i dati:

result = sys.stdin.read() 
+0

Grazie! questo è esattamente quello che mi serviva :) – user3717551

3

Invece di rompere, si desidera solo continue alla riga successiva. L'iteratore si arresterà automaticamente quando raggiunge la fine del file.

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

Grazie per la risposta, ha risolto il mio problema. – user3717551

2

line.strip() sta rimuovendo la riga finale di trascinamento dalla riga di lettura.

Se si desidera quella nuova riga, non è necessario farlo, non credo (il file di output ha l'input newline)?

Quel if stripped bit sta cercando una riga vuota ed era, nell'originale, la caratteristica di terminazione del ciclo.

Questo non è il tuo indicatore di terminazione. Non vuoi fermarti qui. Quindi non farlo.

Il ciclo termina autonomamente quando sys.stdin raggiunge la fine dell'ingresso (EOF).

goccia line.strip() goccia if not stripped: break sostituire result = result + stripped con result = result + line e poi scrivere che al file per ottenere un semplice (anche se probabilmente costoso) cp script.

Ci sono probabilmente modi più efficienti per leggere tutte le linee dallo standard input se si vuole fare qualcosa con loro (dipende dal tuo obiettivo).

+0

Sì hai ragione, io lo spoglio non è necessario (perché cambia il testo letto, e questo non è il mio obiettivo). E infatti "William Pursell" suggerisce un modo più "efficiente per farlo". – user3717551