用Python解析复杂的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

我很难解析如下所示的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 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']}