[python] Divné chování os.walk
Petr Nesladek
petr.nesladek na seznam.cz
Pátek Červen 3 10:31:16 CEST 2011
Jak psal azurIt - měnit řídící pole v cyklu je nebezpečné - jinak ten skript dělá přesně co má:
- na řádku dirs.remove(name) - vyjme položku na kterou právě ukazuje cyklus
- pointer pak ukazuje na následující položku
- a poté ji na řádku continue přeskočí na následující
Takže myslím, že konstrukce :
if self.exclude_dir(dirname):
continue;
... a za ní zpracování
self.create_context(dirname,True);
for file in files:
filename=os.path.join(root,file);
self.create_context(filename,False);
bude naprosto funkční, a nebude třeba modifikovat řídící strukturu cyklu for
Petr
> ------------ Původní zpráva ------------
> Od: Filip Bartmann <filbar na centrum.cz>
> Předmět: [python] Divné chování os.walk
> Datum: 01.6.2011 17:21:41
> ----------------------------------------
> V programu mám tento kód:
> ---------------------------------------------------------------------------
> def list_dir(self,dir):
> for root,dirs,files in os.walk(dir):
> print dirs;
> for name in dirs:
> dirname=os.path.join(root,name);
> if self.exclude_dir(dirname):
> dirs.remove(name);
> continue;
> print name;
> self.create_context(dirname,True);
> for file in files:
> filename=os.path.join(root,file);
> self.create_context(filename,False);
>
> def exclude_dir(self,dir):
> for e in self.exclude:
> e=re.sub("/$","",e);
> if re.search("^"+e,dir):
> return True;
> return False;
>
> --------------------------------------------------------------------------
>
> Problém mi ale dělá podmínka exclude_dir, ona jaky by nevynechávala
> jenom zadaný adresář, ale mimo to i jeden navíc.
>
> V dirs mám např(print dirs v kódu): ['usr', 'hosts', 'lib', 'selinux',
> 'etc', 'lib64', 'var', 'dev', 'bin', 'proc'] a na vynechání mám určene
> hosts. selinux a var, jenomže ono mi to projde jenom adresáře(print
> name v kódu):
> usr
> lib64
> bin
>
> Tedy když chci vynechat třeba selinux, tak mi to vynechá i etc, ale
> zajímavé je, že podadresáře toho v tomto případě etc to vezme, ale v té
> samotné úrovni to přeskakuje jakoby oba dva adresáře.
>
> Předem děkuji za odpověď.
>
> Filip Bartmann
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
>
>
Další informace o konferenci Python