【问题标题】:Complicated ASCII file parsing with Python使用 Python 解析复杂的 ASCII 文件
【发布时间】:2014-11-07 08:29:17
【问题描述】:

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

【问题讨论】:

  • 你确定你真的希望变量名是动态的吗?这是一个相当少见的要求。除此之外,PLY (Python Lex Yacc) 是一个非常强大的文本文件解析工具。
  • 虽然这不是绝对需要,但它是一种强烈的偏好。通常此类标头的数量少于 6 个,但它们的名称可能会有所不同。

标签: python parsing ascii


【解决方案1】:

通常情况下,您需要动态创建变量(名称)。而是使用字典来存储所有数组。

您可以逐行解析,并检查该行是否以'--'开头 一旦你找到这样的一行,你需要解析其余的行,直到你在行尾得到一个'\'。

并再次重复该过程直到文件结束

类似的东西会起作用

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)

这将返回格式如下的字典:

'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']}

对于您给出的输入

在使用代码之前,请注意边缘情况和异常处理,

祝你好运!

【讨论】:

  • 非常感谢,它以我需要的方式完成了工作!字典在这里确实有用且简单。
  • 我可以问一个小问题:如果记录之间没有空行,您的“get_data”函数会是什么样子?
  • 假设记录仍然是换行符分隔,如果记录之间没有空行也没关系。该程序本质上是在寻找以“--”开头并以“/”结尾的文件块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
  • 1970-01-01
相关资源
最近更新 更多