需要很好的文件解析
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}
我需要处理这样的文件
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}