实际上,它与 CSV 相差甚远。
您可以将该文件用作迭代器;以下生成器函数产生完整的部分:
def load_sections(filename):
with open(filename, 'r') as infile:
line = ''
while True:
while not line.startswith('****'):
line = next(infile) # raises StopIteration, ending the generator
continue # find next entry
entry = {}
for line in infile:
line = line.strip()
if not line: break
key, value = map(str.strip, line.split(':', 1))
entry[key] = value
yield entry
这会将文件视为迭代器,这意味着任何循环都会将文件推进到下一行。外环仅用于从一个部分移动到另一个部分;内部while
和for
循环完成所有实际工作;首先跳过行,直到****
找到标题部分(否则丢弃),然后遍历所有非空行以创建一个部分。
循环使用函数:
for section in load_sections(filename):
print section
在文本文件中重复您的示例数据会导致:
>>> for section in load_sections('/tmp/test.txt'):
... print section
...
{'Data4': '715', 'Data1': '0.1834869385E-002', 'ID': '01', 'Data3': '-0.1091356549E+001', 'Data2': '10.9598489301'}
{'Data4': '715', 'Data1': '0.1834869385E-002', 'ID': '01', 'Data3': '-0.1091356549E+001', 'Data2': '10.9598489301'}
{'Data4': '715', 'Data1': '0.1834869385E-002', 'ID': '01', 'Data3': '-0.1091356549E+001', 'Data2': '10.9598489301'}
如果您愿意,可以添加一些数据转换器;键到可调用的映射会做:
converters = {'ID': int, 'Data1': float, 'Data2': float, 'Data3': float, 'Data4': int}
然后在生成器函数中,而不是entry[key] = value
do entry[key] = converters.get(key, lambda v: v)(value)
。