实际上,它与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'}
您可以根据需要添加一些数据转换器。键到callable的映射将执行以下 *** 作:
converters = {'ID': int, 'Data1': float, 'Data2': float, 'Data3': float, 'Data4': int}
然后在生成器函数中,而不是
entry[key] = valuedo
entry[key] = converters.get(key, lambdav: v)(value)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)