python - 需要很好的文件解析
问题描述
我需要处理这样的文件
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'}
我没有以任何快速而优雅的方式成功交易
解决方案
这是一个非常简单的解析练习,您真的应该自己尝试弄清楚。
这是我的解决方案,使用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'}
推荐阅读
- python-3.x - ImportError:在导入 Pandas 时无法导入名称 parse_date
- vue.js - 在数组中声明时,Vue 道具的类型是什么?
- python - 在 python 中想要读取特定端口上的 UDP 广播消息
- ubuntu - 如何在 Linux 虚拟实例上挂载外部卷?
- vim - 如何让vim给命令行参数+
优先于 'au VimEnter *? 静默加载视图'? - multithreading - 与不带take() 的无锁并发队列相比,blockingqueue 的强度
- c++ - c ++:在if语句中区分模板
- c# - msbuild 无法复制清单,因为它没有找到
- java - java中内置的PriorityQueue remove()函数如何找到需要删除的元素
- ios - 使用 Swift 包管理器安装没有 package.swift 的第三方