首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:将结构化文本解析为CSV格式

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

Stack Overflow用户
提问于 2013-10-17 21:01:32
回答 1查看 1.1K关注 0票数 0

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

输入如下所示

代码语言:javascript
复制
[-------- 1 -------]
Version: 2
 Stream: 5
 Account: A
[...]
[------- 2 --------]
 Version: 3
 Stream: 6
 Account: B
[...]

输出应该如下所示:

代码语言:javascript
复制
Version; Stream; Account; [...]
2; 5; A; [...]
3; 6; B; [...]

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

我能够将<key>: <values>-pairs检索成CSV格式

代码语言:javascript
复制
colonseperated = re.compile(' *(.+) *: *(.+) *')
fixedfields = re.compile('(\d{3} \w{7}) +(.*)')

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-17 21:12:45

阅读这份清单并不难:

代码语言:javascript
复制
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模块,特别是 class生成CSV输出。

代码语言:javascript
复制
# 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'

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19437207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档