Python:将结构化文本解析为CSV格式

时间:2013-10-17 21:01:32

标签: python csv text

我想使用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> - 对的结构化文本记录,输出应为CSV,每行包含一条记录。

我可以通过

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

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

1 个答案:

答案 0 :(得分: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)

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