2009-11-24 7 views
6

Czy jest jakiś sposób na uzyskanie następnego tokena z pliku w Pythonie, na przykład klasa Skanera w Javie?Jak zdobyć następny token (int, float lub string) z pliku w Pythonie?

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

Chciałbym ignorować spacje, tabulatory, znaki nowej linii i po prostu kolejny int/pływaka/słowo z pliku. Wiem, że mogłem przeczytać linie i zbudować coś takiego jak Scanner, ale chciałbym się dowiedzieć, czy nie ma czegoś, co mógłbym wykorzystać.

Szukałem, ale mogłem znaleźć tylko metody zorientowane liniowo.

Dziękujemy!

+1

Nie należy używać python zarezerwowanych słów jako nazw zmiennych. Często zdarza się, że redefiniujesz 'in',' str' lub 'list', a później dostajesz zabawne komunikaty o błędach, które mogą być trudne do debugowania. – cfi

+0

@ cfi: thanks - Zmieniłem "in" na "input" w przykładzie. – Jay

+1

Przeniesiono problem ze słowa kluczowego na wbudowane. Jesteś bezpieczny, ponieważ prawdopodobnie używasz Pythona 2. *. W Pythonie 3 'raw_input()' został zastąpiony przez 'input()'. [Dokumenty tutaj] (http://docs.python.org/3.3/library/functions.html). Małe "skaner" może być bezpieczny ... – cfi

Odpowiedz

10

Sprawdź shlex moduł w bibliotece standardowej: 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"'))) 

To nie obsługuje pływaków sposób wydaje się chcieć. Może możesz go rozszerzyć lub zmodyfikować.

+1

W rzeczywistości obsługuje on pływaki! Po prostu ustaw atrybut whitespace_split na True i sparsuj kropki zgodnie z oczekiwaniami. :-) Dziękuję za to, dokładnie to, czego potrzebowałem! – Jay

+1

To jest świetne. Możesz go podać za pomocą 'sys.stdin' i uzyskać następny token za pomocą iteracji lub' get_token() '. –

0

Prawdopodobnie można spojrzeć na PLY

1

Nie sądzę, że jest coś takiego w tym wyrafinowanym.

Ale można spojrzeć na następujących opcji

  • use re.split(pattern, string) i to, co chcesz, zapewniając regex męska
  • Jest gdzieś Scanner klasa w module re (ale nie sądzę, że opracowano go dalej)
  • można również rozważyć użycie tokenize + StringIO
  • Albo jak sam wymienić: zbudować samemu, darować to zrobić społeczności i dostać sławny;)