需要很好的文件解析

Nice file parsing required

我需要处理这样的文件

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

我需要将其转换为字典:

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

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

这是一个非常简单的解析练习,你真的应该自己尝试一下。

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

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

让我先说一下我从你的要求中了解到的内容。

  • 您输入的是一个 csv 文件,带有可选的引号字段:好的,csv 模块可以解析它
  • 每条记录的第一个字段将用作字典中的键
  • 第三个字段被忽略
  • 第二个字段将是字典中的值。如果它不包含逗号,它将按原样使用,否则该值将是一个拆分列表

在尝试编写任何代码之前,您应该始终用通俗易懂的英语(或任何您的母语)详细说明您想做什么。因为编码部分应该只是规范的翻译。

这里的 Python 代码(根据我的规格...)可以是:

with open(inputfile) as fd:
    rd = csv.reader(fd)  # you files uses the default for quoting and delimiter
    _ = next(rd)         # skip header line
    result = {}
    for row in rd:
        result[row[0]] = row[1].split(',') if ',' in row[1] else row[1]

事实上,理解会比循环更 Pythonic:

    result = {row[0]: row[1].split(',') if ',' in row[1] else row[1]
              for row in rd}