[python] postupne prochazeni souboru

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod skybus 23. 10. 2012 16:09

ahoj
potrebuji nacist soubory ze zadane cesty a pak je po jednom prochazet. Nejak takto by to melo vypadat.

Kód: Vybrat vše
class Adresar:
    import os
    def __init__(self, cesta):
        self.cesta = cesta
        self.seznam_souboru = os.listdir(self.cesta)
   
    def prochazeni_souboru(self):
        for nazev_souboru in range(len(self.seznam_souboru)):
            o_soubor = open(nazev_souboru, "r")
            obsah_souboru = o_file.read()
            yield (nazev_souboru, obsah_souboru)
           
if __name__ == "__main__":
    proch_soub = Adresar(r'cesta')
    for nazev_souboru, obsah_souboru in proch_soub.prochazeni_souboru():
        print(nazev_souboru)
        print(obsah_souboru) 


Stale vsak dostavam hlasku: global name 'os' is not defined. Pritom jsem snad os modul importoval spravne. A dale si nejsem jisty, zda pouzivam spravne yield. Je to tak, ze se bude provadet funkce prochazeni souboru() a az narazi na yield,tak se hodnoty predaji do cyklu for nazev_souboru, obsah_souboru in proch_soub.prochazeni_souboru(): pak se vytisknou a dale se pak zopakuje cyklus ve funkci ktery zase vrati hodnoty ktere se vytisknou atd. ?

Dekuji za pomoc
Naposledy upravil Vebloud dne 24. 10. 2012 09:00, celkově upraveno 1
Důvod: Opravdu jsou hranaté závorky takový problém?
skybus
Kolemjdoucí

Odeslat příspěvekod satai 23. 10. 2012 16:21

Ten import by imo nemel byt uvnitr class ale jako top level statement, takze posunout az nahoru.

-- 23. 10. 2012 17:26 --

Proc tam mas for nazev_souboru in range(len(self.seznam_souboru)):

range(neco) ti udela list intu, asi chces iterovat primo pres ty soubory?

A pozor, mas v seznam_souboru seznam jmen souboru, ale bez cesty k nim
Understanding is a three edged sword. Your side, their side, and the truth.
satai
Junior
Uživatelský avatar

Odeslat příspěvekod skybus 23. 10. 2012 16:45

diky za rady
tu cestu zadavam pri vytvareni objektu (proch_soub = Adresar(r'c:/hgvj/chng') ), jen jsem ji sem nenapsal

ted mi to ale pro zmenu pise chybu kdyz se znazim otevrit soubor: No such file or directory. Vadi ze s cestou k souboru pracuji jako s parametrem a tride ji predam az pri vytvareni objektu?
skybus
Kolemjdoucí

Odeslat příspěvekod JirkaVejrazka 23. 10. 2012 17:17

Mel bys cist cele odpovedi, kdyz uz ti nekdo pomaha. Satai ti tvuj problem odhalil uz pred tim, nez jsi o nem napsal.

"for nazev_souboru in range(len(self.seznam_souboru)):" ti udela cyklus pres "poradove cislo" souboru. Dej si primo za ten "for" prikaz "print(nazev_souboru)" a uvidis to sam. Videl bys to i tak, protoze to tisknes, ale bohuzel ti program hodi chybu driv, nez se k tomu tisku dostane.

Mimochodem, je velmi dobrym zvykem obalit vsechnu praci se soubory do try... except IOError, ale na to prijdes casem sam.
JirkaVejrazka
Mírně pokročilý

Odeslat příspěvekod satai 23. 10. 2012 17:30

Jinak pokud mohu doporucit, nauc se pouzivat debuger. Neni vetsi poteseni, nez hned videt, co ti kde tece za data. Obzvlaste v dynamicky typovanem jazyce jako je Python.
(Dalsi level budou unittesty, ale vseho do casu...)
Understanding is a three edged sword. Your side, their side, and the truth.
satai
Junior
Uživatelský avatar

Odeslat příspěvekod skybus 23. 10. 2012 18:24

to JirkaVejrazka: odpoved jsem si precetl a cyklus upravil do tvaru: "for nazev_souboru in self.seznam_souboru" a kdyz seznam souboru vytisknu tak tam jsou, ale v okamziku kdy chci soubory otevrit tak je nelze nalezt (No such file or directory: 'kls.dk55d').
Muze to byt zpusobene tim ze jsou ve jmenech souboru tecky? Kdyz se ale nazvy souboru zobrazi v seznamu take s teckami, tak by to asi vadit nemelo ne?
skybus
Kolemjdoucí

Odeslat příspěvekod satai 23. 10. 2012 18:28

A nechces nahodou cist cesta/kls.dk55d misto kls.dk55d?
Understanding is a three edged sword. Your side, their side, and the truth.
satai
Junior
Uživatelský avatar

Odeslat příspěvekod skybus 23. 10. 2012 19:19

dik bylo to tim, kdyz jsem dal modul do adresare se soubory tak to slo. stale se mi to ale nedari udelat tak, abych mohl mit modul i jinde. Zkousel jsem ulozit cestu k souboru do promenne a otevrit to jako open(cesta/soubor) ale to mi dava syntax error.
skybus
Kolemjdoucí

Odeslat příspěvekod satai 23. 10. 2012 19:25

Mno, myslim, ze na tohle bys uz mohl prijit sam ;)
Understanding is a three edged sword. Your side, their side, and the truth.
satai
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků