2009-11-24 12 views
6

Gibt es eine Möglichkeit, das nächste Token aus einer Datei in Python zu holen, wie es beispielsweise die Klasse Scanner in Java tut?Wie erhalte ich das nächste Token (int, float oder string) aus einer Datei in Python?

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

Ich möchte Leerzeichen, Tabulatoren, Zeilenumbrüche ignorieren und sich nur die nächste int/float/Wort aus der Datei. Ich weiß, dass ich die Zeilen lesen und selbst etwas wie Scanner bauen könnte, aber ich würde gerne wissen, ob es nicht schon etwas gibt, das ich benutzen könnte.

Ich habe gesucht, konnte aber nur linienorientierte Methoden finden.

Vielen Dank!

+1

Verwenden Sie keine Python-reservierten Wörter als Variablennamen. Es ist ein häufiger Fehler, "in", "str" ​​oder "liste" neu zu definieren und später lustige Fehlermeldungen zu erhalten, die schwer zu debuggen sind. – cfi

+0

@cfi: danke - ich habe im Beispiel "in" in "input" geändert. – Jay

+1

Das Problem wurde von Schlüsselwort zu Einbauten verschoben. Du bist sicher, da du vermutlich auf Python 2 bist. *. In Python 3 wurde 'raw_input()' durch 'input()' ersetzt. [Docs hier] (http://docs.python.org/3.3/library/functions.html). Kleinbuchstaben "Scanner" könnte sicher sein ... – cfi

Antwort

10

Schauen Sie sich die shlex-Modul in der Standardbibliothek: 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"'))) 

Es ist nicht schwimmt nicht handhaben, wie Sie scheinen wollen. Vielleicht können Sie es erweitern oder ändern.

+1

Eigentlich behandelt es Floats! Setzen Sie das Attribut whitespace_split auf True und es wird Punkte wie erwartet analysieren. :-) Danke dafür, genau das habe ich gebraucht! – Jay

+1

Das ist großartig. Sie können es mit 'sys.stdin' füttern und das nächste Token mit Iteration oder' get_token() 'holen. –

0

Wahrscheinlich können Sie einen Blick auf PLY

1

Ich glaube nicht, dass es wirklich etwas um so ausgeklügelt ist.

Aber Sie können einen Blick auf die folgenden Optionen nehmen

  • use re.split(pattern, string) und bekommen, was Sie wollen von regex des
  • Es gibt irgendwo eine Scanner Klasse im Modul re (aber ich glaube nicht, dass sie die Bereitstellung entwickelte sie weiter)
  • Sie auch mit tokenize + StringIO
  • Oder wie Sie selbst erwähnt in Erwägung ziehen könnte: Bauen Sie sich ein, spenden sie Gemeinschaft tun und berühmt bekommen;)
Verwandte Themen