首页 > 解决方案 > 需要很好的文件解析

问题描述

我需要处理这样的文件

keyword,synonym,bidirectional
5487500j,54875,false
76x76,76 x 76,true
feuille,"papier,ramette",false
7843000j,78430,false

我需要将其转换为 dict :

{'5487500j':'54875', '76x76':'76 x 76','feuille':['papier','ramette'], '7843000j':'78430'}

我没有以任何快速而优雅的方式成功交易

标签: pythoncsvparsingquote

解决方案


这是一个非常简单的解析练习,您真的应该自己尝试弄清楚。

这是我的解决方案,使用find()andrfind()查找第一个和最后一个逗号的索引以将行拆分为块。第一个和中间块将用作字典中的键:值对。中间块可能需要一些额外的解析和调整,见下面的代码。

def parse(line):
    first = line[:line.find(',')]
    last = line[line.rfind(','):]
    mid = line.replace(first, '').replace(last, '').strip(',')
    #print(first, mid)
    if ',' in mid:
        mid = mid.strip('"')
        mid = mid.split(',')
    return {first: mid}


txt = \
'''
keyword,synonym,bidirectional
5487500j,54875,false
76x76,76 x 76,true
feuille,"papier,ramette",false
7843000j,78430,false
'''

r = {}
for line in txt.split('\n'):
    if line:
        if line.startswith('keyword'):
            continue
        r.update(parse(line))
        
print(r)

{'5487500j': '54875', '76x76': '76 x 76', 'feuille': ['papier', 'ramette'], '7843000j': '78430'}

推荐阅读