解析文本文件中的数据

解析文本文件中的数据,第1张

解析文本文件中的数据

实际上,它与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] = value
do
entry[key] = converters.get(key, lambdav: v)(value)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5631883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存