【问题标题】:Python: parsing structured text to CSV formatPython:将结构化文本解析为 CSV 格式
【发布时间】:2013-10-17 21:01:32
【问题描述】:

我想使用 Python 将纯结构化文本文件转换为 CSV 格式。

输入看起来像这样

[-------- 1 -------]
Version: 2
 Stream: 5
 Account: A
[...]
[------- 2 --------]
 Version: 3
 Stream: 6
 Account: B
[...]

输出应该是这样的:

Version; Stream; Account; [...]
2; 5; A; [...]
3; 6; B; [...]

即输入是由[----<sequence number>----] 分隔并包含<key>: <values>-pairs 的结构化文本记录,输出应为每行包含一条记录的CSV。

我可以通过

将<key>: <values>-pairs 恢复为 CSV 格式
colonseperated = re.compile(' *(.+) *: *(.+) *')
fixedfields = re.compile('(\d{3} \w{7}) +(.*)')

-- 但我无法识别结构化文本记录的开头和结尾以及重写为 CSV 行记录。此外,我希望能够区分不同类型的记录,即区分 - 比如 - Version: 2 和 Version: 3 类型的记录。

【问题讨论】:

  • 您的输入文件不是 CSV 格式;它是结构化的,但不是分隔符分隔的。你的输出是。
  • 您希望如何处理不同版本的记录?
  • 不同类型的记录有不同数量的元素。
  • 啊,这很重要;您的输出也不是严格的 CSV。我在下面的回答假设记录是每个相同的大小。
  • 你知道事先使用了哪些字段吗?还是您需要先从输入文件中收集这些?

标签: python csv text


【解决方案1】:

阅读列表并不难:

def read_records(iterable):
    record = {}
    for line in iterable:
        if line.startswith('[------'):
            # new record, yield previous
            if record:
                yield record
            record = {}
            continue
        key, value = line.strip().split(':', 1)
        record[key.strip()] = value.strip()

    # file done, yield last record
    if record:
        yield record

这会根据您的输入文件生成字典。

由此您可以使用csv 模块生成CSV 输出,特别是csv.DictWriter() class:

# List *all* possible keys, in the order the output file should list them
headers = ('Version', 'Stream', 'Account', ...)

with open(inputfile) as infile, open(outputfile, 'wb') as outfile:
    records = read_records(infile)

    writer = csv.DictWriter(outfile, headers, delimiter=';')
    writer.writeheader()

    # and write
    writer.writerows(records)

记录中缺少的任何标题键都会将该记录的该列留空。您错过的任何 extra 标头都会引发异常;要么将它们添加到headers 元组,要么将extrasaction 关键字设置为DictWriter() 构造函数为'ignore'。

【讨论】:

  • 感谢您提供宝贵且解释清楚的提示。我现在确实有一个工作原型。有一个问题,仍然。使用完整数量的标头(大约 100 个),没有正确的输出只生成一行错误映射的字段:csv(headers) 有限制吗?
  • 我不知道;听起来可能是其他地方出了问题。
猜你喜欢
  • 2017-10-26
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2018-04-07
  • 2018-07-10
  • 2018-12-04
相关资源
最近更新 更多