[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