[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