Codebase list python-igor / e0a5ed5
Add igor.packed.walk for traversing a packed experiment filesystem. W. Trevor King 11 years ago
3 changed file(s) with 51 addition(s) and 1 deletion(s). Raw diff Collapse all Expand all
2121 from .struct import Field as _Field
2222 from .util import byte_order as _byte_order
2323 from .util import need_to_reorder_bytes as _need_to_reorder_bytes
24 from .util import _bytes
2425 from .record import RECORD_TYPE as _RECORD_TYPE
2526 from .record.base import UnknownRecord as _UnknownRecord
2627 from .record.base import UnusedRecord as _UnusedRecord
180181 if filename in cwd:
181182 raise ValueError('collision on name {} in {}'.format(
182183 filename, ':'.join(d for d,cwd in dir_stack)))
184
185 def walk(filesystem, callback, dirpath=None):
186 """Walk a packed experiment filesystem, operating on each key,value pair.
187 """
188 if dirpath is None:
189 dirpath = []
190 for key,value in sorted((_bytes(k),v) for k,v in filesystem.items()):
191 callback(dirpath, key, value)
192 if isinstance(value, dict):
193 walk(filesystem=value, callback=callback, dirpath=dirpath+[key])
109109 if oldcksum > 2**31:
110110 oldcksum -= 2**31
111111 return oldcksum & 0xffff
112
113 def _bytes(obj, encoding='utf-8'):
114 """Convert bytes or strings into bytes
115
116 >>> _bytes(b'123')
117 '123'
118 >>> _bytes('123')
119 '123'
120 """
121 if _sys.version_info >= (3,):
122 if isinstance(obj, bytes):
123 return obj
124 else:
125 return bytes(obj, encoding)
126 else:
127 return bytes(obj)
14141414 'angleQ1': <WaveRecord ...>,
14151415 'radiusData': <WaveRecord ...>,
14161416 'radiusQ1': <WaveRecord ...>}}
1417 <BLANKLINE>
1418 walking filesystem:
1419 walk callback on ([], root, {'K0': 0.0,...})
1420 walk callback on (['root'], K0, 0.0)
1421 walk callback on (['root'], K1, 0.0)
1422 walk callback on (['root'], K10, 0.0)
1423 ...
1424 walk callback on (['root'], K9, 0.0)
1425 walk callback on (['root'], Packages, {'PolarGraphs': ...})
1426 walk callback on (['root', 'Packages'], PolarGraphs, {...})
1427 walk callback on (['root', 'Packages', 'PolarGraphs'], V_bottom, 232.0)
1428 ...
1429 walk callback on (['root', 'Packages'], WMDataBase, {...})
1430 ...
1431 walk callback on (['root'], radiusQ1, <WaveRecord ...>)
14171432 """
14181433
14191434 import os.path
14221437 from igor import LOG
14231438 from igor.binarywave import load as loadibw
14241439 from igor.packed import load as loadpxp
1440 from igor.packed import walk as _walk
14251441 from igor.record.base import TextRecord
14261442 from igor.record.folder import FolderStartRecord, FolderEndRecord
14271443 from igor.record.variables import VariablesRecord
14371453 data = loadibw(path)
14381454 pprint(data)
14391455
1440 def dumppxp(filename):
1456 def walk_callback(dirpath, key, value):
1457 print('walk callback on ({}, {}, {})'.format(
1458 dirpath, key, pformat(value)))
1459
1460 def dumppxp(filename, walk=True):
14411461 LOG.info('Testing {}\n'.format(filename))
14421462 path = os.path.join(_data_dir, filename)
14431463 records,filesystem = loadpxp(path)
14551475 pprint(record)
14561476 print('\nfilesystem:')
14571477 pprint(filesystem)
1478 if walk:
1479 print('\nwalking filesystem:')
1480 _walk(filesystem, walk_callback)
14581481
14591482 def pprint(data):
14601483 lines = pformat(data).splitlines()