Python Generators

mpc mcohoon at gmail.com
Sat Mar 15 21:35:10 CET 2008


HI all,
I am trying to write a while loop that will iterate over generators to
capture all the headers of FFCache directories. However, the
generators embedded within the argument of another generator do not
seem to re-initiate. the example below loops through and initiates the
generator embedded in the argument only once. Can anyone explain while
the generator will not re-initiate, and suggest a simple fix?

#!/usr/bin/env python
import os,struct,time
def generate_headers(cachedir):
    for name, blocksize in cachefiles:
        pathname = os.path.join(cachedir,name)
        f = open(pathname,"rb")
        f.seek(4096)
        while True:
            header = f.read(36)
            if not header: break
            fields = struct.unpack(">9I",header)
            if fields[0] == 0x00010008: yield f, fields
            fp = f.tell()
            offset = fp % blocksize
            if offset:
                f.seek(blocksize - offset,1)
        f.close()
def concatenate(sequences):
    for seq in sequences:
        for item in seq:
            yield item

all_caches = (path for path,dirlist,filelist in os.walk("/Users/") if
'_CACHE_MAP_' in filelist)
cachefiles = [('_CACHE_001_',256),('_CACHE_002_',1024),('_CACHE_003_',
4096)]
n = 0
while True:
    n += 1
    time.sleep(0.5)
    headers  = concatenate(generate_headers(path) for path in
all_caches)
    for h in headers:
        print h,n
# this doesn't work either

while True:
    n += 1
    time.sleep(0.5)
    for path in all_caches:
        headers  =  generate_headers(path)
        for h in headers:
            print h,n
# however if I hard code the path
path = "FFCache"
while True:
    n += 1
    headers  = generate_headers(path)
    for h in headers:
            print h,n
#but of course i do not wish to hard code the path.



More information about the Python-list mailing list