[python] file.next() (bylo Buducnost Pythonu: lambda, map, filter)

Petr Přikryl prikryl na atlas.cz
Úterý Listopad 14 18:52:18 CET 2006


radek napsal(a):
>> > Avšak souhlasím s názorem, že soubory se čtou 
>> > většinou po řádcích  takže je
>> > to takto praktické ale mám z toho pocit vyjímky která se mi nelíbí.
>>
>> Problém je v tom, že zadrátovat do jazyka konstrukci, která ušetří
>> několik písmenek je sice praktické, ale nedobré. Nechť je prostě všechni
>> vidět. Pokud se soubory mohou číst i jinak, než po řádcích, což se děje
>> velmi často, tak bych tyto zjednodušující konstrukce do jazyka vůbec
>> nedával.
>>
> 
> Presne tak, priklady, jak by to vypadalo jinak:
> 
> #cteni po radcich s defaultnim line oddelovacem (jak je ted)
> for line in file("data.txt").lines():
> ...
> 
> #cteni po radcich, ktere jsou oddelene oddelovacem <br>
> for line in file("data.txt").lines("<br>"):
> [...]

Ale definice, že řádek v textovém souboru je ukončen
<br> jaksi není obecně přijímaná. Když chci, musím
si to napsat sám a nebo použít odpovídající parser.


Jan Matějka
> Ono obecnější řešení je udělat parsovací generátory, které by šly použít s
> čímkoliv file-like jako vstupním prametrem, a nestrkat parsování to objektu
> file. Tedy: [...]
> 
> for line in lines(file("data.txt")):
>  ...
> [...] atd.
> 
> Výpočetní náročnost by zústala stejná. Generátory mi přijdou jako skvělý
> nástroj, škoda že se GvR brání zobecnění do více úrovní zanoření jenž nabízí
> stackless python. 

Ale vdyť mi nic nebrání zpracovávat soubor po znacích.

# Vygenerujeme si testovaci textovy soubor.
f = open('test.txt', 'w')
for i in xrange(3):
     f.write('Line %d.\n' % i)
f.close()


# Pruchod po znacich.

f = open('test.txt')
c = 'init'
while c != '':
     c = f.read(1)
     print c
f.close()

A nic mi nebrání napsat generátor, který vezme a bude vracet znaky
a použít ho:

def chargen(f):
     c = 'init'
     while c != '':
         c = f.read(1)
         yield c

for c in chargen(file('test.txt')):
     print c

A můžu si napsat jakýkoliv jiný generátor/parser.

pepr


Další informace o konferenci Python