2009-11-24 13 views
6

C'è un modo per ottenere il prossimo token da un file in Python, come ad esempio la classe Scanner fa in Java?Come ottenere il prossimo token (int, float o stringa) da un file in Python?

File file = new File("something"); 
Scanner myinput = new Scanner(file); 
double a = myinput.nextDouble(); 
String s = myinput.next(); 

vorrei ignorare gli spazi bianchi, tabulazioni, a capo e solo ottenere la prossima int/float/parola dal file. So che potrei leggere le righe e costruire qualcosa come Scanner me stesso, ma mi piacerebbe sapere se non c'è già qualcosa che potrei usare.

Ho cercato in giro ma ho potuto trovare solo metodi orientati alla linea.

Grazie!

+1

Non utilizzare parole riservate python come nomi di variabili. È un errore comune ridefinire 'in',' str' o 'list' e in seguito ottenere messaggi di errore divertenti che potrebbero essere difficili da debugare. – cfi

+0

@cfi: grazie - Ho modificato "in" a "input" nell'esempio. – Jay

+1

Spostato il problema dalla parola chiave ai built-in. Sei al sicuro dal momento che presumibilmente sei su Python 2. *. In Python 3 'raw_input()' è stato sostituito da 'input()'. [Docs here] (http://docs.python.org/3.3/library/functions.html). La minuscola 'scanner' potrebbe essere sicura ... – cfi

risposta

10

Scopri i shlex modulo nella libreria standard: http://docs.python.org/library/shlex.html

import shlex 
import StringIO # use in place of files 

list(shlex.shlex(StringIO.StringIO('Some tokens. 123, 45.67 "A string with whitespace"'))) 

Non gestisce carri il modo in cui ti sembra di volere. Forse puoi estenderlo o modificarlo.

+1

In realtà, gestisce i float! Basta impostare l'attributo whitespace_split su True e analizzerà i punti come previsto. :-) Grazie per questo, è esattamente quello di cui avevo bisogno! – Jay

+1

Questo è fantastico. Puoi nutrirlo con 'sys.stdin' e ottenere il prossimo token usando iteration o' get_token() '. –

0

probabilmente si può dare un'occhiata a PLY

1

Non penso che ci sia qualcosa di veramente sofisticato.

Ma si può dare un'occhiata a una delle seguenti opzioni

  • use re.split(pattern, string) e ottenere ciò che si desidera, fornendo delle
  • C'è da qualche parte una classe Scanner nel modulo re (ma io non credo che regex sviluppato ulteriormente)
  • si potrebbe anche considerare l'utilizzo di tokenize + StringIO
  • O come lei stesso ha citato: costruire uno voi stessi, donare è fare comunità e diventare famosi;)
Problemi correlati