用Python解析复杂的ASCII文件
我很难解析如下所示的ASCII码。 我需要创建一个数组,命名为注释行中的第一个字母项目(以“---”开头),并将注释行和内嵌“/”之间的所有数字追加到该数组中。 文件中可能有几个这样的记录用Python解析复杂的ASCII文件,python,parsing,ascii,Python,Parsing,Ascii,我很难解析如下所示的ASCII码。 我需要创建一个数组,命名为注释行中的第一个字母项目(以“---”开头),并将注释行和内嵌“/”之间的所有数字追加到该数组中。 文件中可能有几个这样的记录 -- LIQ units - sm³/day ( 8 values ) 500.0 1000.0 1500.0 2000.0 3000.0 4000.0 5000.0 6000.0 / -- GRAT units - sm³/day ( 7 values ) 0.0 200
-- LIQ units - sm³/day ( 8 values )
500.0 1000.0 1500.0 2000.0 3000.0
4000.0 5000.0 6000.0 /
-- GRAT units - sm³/day ( 7 values )
0.0 200000.0 400000.0 600000.0 800000.0
999999.9 1200000.0 /
例如,我希望得到
liq=[500.0、1000.0、1500.0、2000.0、3000.0、4000.0、5000.0、6000.0]
在一般情况下,不需要动态创建变量(名称)。而是使用字典来存储所有数组
您可以逐个分析这些行,并检查该行是否以“---”开头
一旦找到这样一行,就需要解析其余的行,直到在行尾得到一个“\”
并再次重复该过程,直到文件结束
类似的方法也会奏效
import re
pat = re.compile(r'^--\s*(?P<name>\w+).*')
def get_data(file):
'''gets the numbers till you find "/"
'''
arr = []
for line in file:
numbers = line.split()
if numbers[-1] == '/':
arr.extend(numbers[:-1])
break
else:
arr.extend(numbers)
return arr
for line in file:
if line.startswith('--'):
name = pat.match(line).groups()[0]
arrays[name] = get_data(file)
对于您提供的输入
在使用代码之前,请注意边缘情况和异常处理
祝你好运 你确定你真的希望变量名是动态的吗???这是一个相当罕见的要求。除此之外,PLY(pythonlex-Yacc)是解析文本文件的一个非常强大的工具。通常,这样的标题的数量少于6个,但它们的名称可能会有所不同。非常感谢,它以我需要的方式完成了这项工作!字典在这里确实很有用,也很简单。我可以问一个小问题:如果记录之间没有空行,那么“get_data”函数会是什么样子?假设记录仍然是换行分隔的,那么记录之间没有空行就无关紧要了。该程序实际上是在查找文件中以“-”开头、以“/”结尾的块。
'GRAT': ['0.0',
'200000.0',
'400000.0',
'600000.0',
'800000.0',
'999999.9',
'1200000.0'],
'LIQ': ['500.0',
'1000.0',
'1500.0',
'2000.0',
'3000.0',
'4000.0',
'5000.0',
'6000.0']}