|
||||||||||||||||||||||||||||||||||||||||||||||||
Menu
Distributions (131)
Software (10844)
|
Python (10.) - Vstup a výstupV dnešním díle se podíváme na to, jaké možnosti běžného (terminál, soubory) vstupu a výstupu nám Python nabízí.
Již v předchozích dílech jsme zmínili příkaz
Nezmínili jsme funkci Python, podobně jako unix obecně, celkem nerozlišuje, z čeho čteme a kam píšeme, pro programátora mezi souborem, terminálem či třeba síťovým spojením není velký rozdíl, všechny tyto případy jsou reprezentovány objektem s přibližně stejnými metodami, nazývejme takový objekt stream (proud). Samozřejmě stream implementuje pouze metody, které pro něj mají smysl. Například čtení ze standardního výstupu (většinou) smysl nemá. Standardní vstup a výstup
Zpočátku můžeme za zajímavé považovat streamy reprezentující standardní
vstup, výstup a chybový výstup. Tyto proudy nalezneme ve standardním
modulu Samozřejmě, že tyto proudy jsou proměnné jako každé jiné a je tedy možné změnit stream používaný pro vstup či výstup a tím dosáhnout nejrůznějších žádoucích efektů. Soubory
Streamy také můžeme použít k přístupu k souborům, slouží k tomu
funkce
Režim je řetězec, jehož první znak určuje jestli soubor chceme
číst (
Pokud režim neuvedeme použije se výchozí hodnota Čtení ze streamu
Pokud tedy chceme přečíst soubor po jednotlivých řádcích a něco s nimi provést (což je dle mého názoru asi nejčastější operace, kterou chceme v unixu se souborem provádět), uděláme to například takto: f = open('/etc/inittab','r') i = 0 for l in f.xreadlines(): i = i + 1 print i,l.rstrip() # ořízneme bíle znaky na konci řádku # (tj. minimálně znak nového řádku) # a řádek očíslujeme. Zápis do proudu
Přesnou kopii souboru můžeme s využtím výše uvedených metod vytvořit nějak takto: src = open('10.html','r') # zdrojový soubor dst = open('foo','w') # cílový soubor while True: buf = src.read(4096) # čteme 4KiB najednou dst.write(buf) if len(buf) < 4096: break Posun ve streamuAktuální pozici ve streamu můžeme, pokud to daný stream podporuje, měnit. Je zřejmé, že je nesmysl pokoušet se měnit pozici ve streamu reprezentujícím nějaké zařízení nebo síťové spojení, cestovat časem Python opravdu neumí ^_^.
Ostatní metody
Atributy
Streamy také disponují několika atributy. Atribut Stream ovšem nemusí vůbec být soubor (nebo něco, co se z pohledu rozhraní operačního systému chová jako soubor), ale může to být téměř libovolná třída. Ve standardní knihovně Pythonu tudíž nalezneme nejrůznější třídy různým způsobem obalující jiné streamy (například provádějící komprimaci, převod kódování...) či jenom prostě implementující rozhraní streamu, protože autoři předpokládali, že je vhodné, aby daná třída vypadala jako stream. Dnešní díl tedy zakončíme souhrnnou ukázkou. Napíšeme program, který nám umožní na základě jednoho textového souboru zkopírovat konkrétní byte z jednoho souboru do druhého (k čemu to může být dobré, nechám na představivosti čtenáře). Vstupem bude textový soubor se seznamem offsetů, vstupní binární soubor a výstupem bude jeden soubor obsahující dané byty. #!/usr/bin/env python # -*- coding: utf-8; -*- import sys src_name = raw_input("Jméno vstupního souboru?") txt_name = raw_input("Jméno souboru se seznamem offsetů?") dst_name = raw_input("Jméno výstupního souboru?") txt = open(txt_name,'r') src = open(src_name,'rb') dst = open(dst_name,'wb') for off_s in txt.xreadlines(): off = long(off_s) # Převedeme na číslo src.seek(off) # nastavíme pozici byte = src.read(1) # přečteme 1 byte if byte=='': # případně upozorníme uživatele na možnou chybu sys.stderr.write("Offset za koncem vstupního souboru") dst.write(byte) # uklidíme po sobě src.close() dst.close() txt.close() Doufám, že vás dnešní poněkud vykonstruovaná ukázka neodradila a sejdeme se u dalšího dílu, tentokrát se podíváme na řetězce poněkud podrobněji.
|
Search Software
Search Google
|
||||||||||||||||||||||||||||||||||||||||||||||
©Pavel Kysilka - 2003-2024 | maillinuxsoft.cz | Design: www.megadesign.cz |