2013-11-23 25 views
13

Ho uno script python che utilizza un file di testo e manipola i dati dal file e li invia a un altro file. Fondamentalmente voglio che funzioni per qualsiasi input di file di testo. In questo momento ho letto dal file e poi stampato l'output sullo schermo. Voglio l'output in un file.Come prendere il file di input dal terminale per lo script python?

Così l'utente può digitare quanto segue e prova per qualsiasi tipo di file:

cat input_file.txt | python script.py > output_file.txt. 

Come posso implementare questo nel mio script? Grazie.

cat è il comando in linux. Non so come funziona

+1

Utilizzo di 'cat foo | bar' non è mai necessario; puoi sempre fare semplicemente 'bar abarnert

risposta

26

Il modo migliore per farlo è probabilmente per chiamare i file di input e output come argomenti per lo script python:

import sys 
inFile = sys.argv[1] 
outFile = sys.argv[2] 

Quindi puoi leggere tutti i tuoi dati, fare le vostre manipolazioni, e scrivere i risultati:

with open(inFile,'r') as i: 
    lines = i.readlines() 

processedLines = manipulateData(lines) 

with open(outFile,'w') as o: 
    for line in processedLines: 
     o.write(line) 

È possibile chiamare questo programma eseguendo python script.py input_file.txt output_file.txt

Se è assolutamente necessario pipe i dati a Python (che non è davvero consigliato), utilizzare sys.stdin.readlines()

+0

Perché le tubazioni non sono consigliate? (O intendi dire 'cat foo | python bar.py' e' python bar.py

3
cat input_file.txt | python script.py > output_file.txt. 

È possibile passare una grande stringa che contiene tutti i dati all'interno input_file.txt invece di un file vero e proprio modo per realizzare lo script python, basta prendere che come un argomento stringa e dividere le corde dalle nuove caratteri di linea, ad esempio, è possibile utilizzare "\ n" come delimitatore di dividere quel grande corda e di scrivere a un'outputfile, basta farlo in modo normale

cioè open file, write to the file e close file

+1

'in windows puoi usare "\ n" come delimitatore' è piuttosto ingannevole. Su ogni piattaforma moderna _except_ Windows puoi usare '\ n' come delimitatore. Su Windows, devi usare '\ r \ n', a meno che non usi la modalità testo con newline universali, nel qual caso Python ti permette di trattare Windows come un'altra piattaforma. – abarnert

+0

@abarnert mi hai preso! aggiornato, grazie – JoeC

0

uscita Invio in un file è molto simile a prendere input da un file.

Si apre un file per la scrittura nello stesso modo in cui si esegue la lettura, ad eccezione di una modalità 'w' invece di una modalità 'r'.

Si scrive su un file chiamando lo write su di esso nello stesso modo in cui si legge chiamando read o readline.

Questo è tutto spiegato nella sezione Reading and Writing Files del tutorial.

Quindi, se il codice esistente è simile al seguente:

with open('input.txt', 'r') as f: 
    while True: 
     line = f.readline() 
     if not line: 
      break 
     print(line) 

Hai solo bisogno di fare questo:

with open('input.txt', 'r') as fin, open('output.txt', 'w') as fout: 
    while True: 
     line = fin.readline() 
     if not line: 
      break 
     fout.write(line) 

Se stai cercando di consentire all'utente di passare il nomi di file sulla riga di comando, utilizzare sys.argv per ottenere i nomi di file o utilizzare argparse per l'analisi dell'argomento della riga di comando più complicata.

Ad esempio, è possibile cambiare la prima linea a questo:

import sys 
with open(sys.argv[1], 'r') as fin, open(sys.argv[2], 'w') as fout: 

Ora, è possibile eseguire il programma come questo:

python script.py input_file.txt outputfile.txt 
+0

Cool, grazie, ho funzionato. –

1

Questo metodo (la tua domanda) descrive la lettura dei dati da STDIN:

cat input_file.txt | python script.py

Soluzione: script.py:

import sys 
for line in sys.stdin: 
    print line 

Il metodo di soluzioni sopra descritte prendendo parametri discussione con la chiamata di pitone:

python script.py input_file.txt

Soluzione: script.py:

import sys 
with open(sys.argv[1], 'r') as file: 
    for line in file: 
     print line 

Spero che questo aiuti!

Problemi correlati