我有一个类似csv的文件想要在Python中转换成dict。下面是样本文件:
file start:
...
...
[section-1] # basically a setup info with <key-value> pair
date,2/16/2018
label,test3
size,25
...
[section-2] # contains test parameters and data
NO,parameter1,parameter2
1,50,30
2,-20,32
...
...
file end
我大致知道如何处理这个文件,目标是轻松访问每条记录。像dict这样的东西可能:
{'date':2/16/2018,
'label':test3,
'size':25,
'data':[{'NO':1,'parameter1':50,'parameter2':30}
{'NO':2,'parameter2':-20,'parameter2',32}]
}
用例是我想提取这些数据并将其加载到数据库中。 [section-1]数据将转到顶级表。并且[section-2]数据将根据[section-1] info加载到子表中。
我对Python很陌生。你认为这是转换这个文件的正确方向吗?谁能告诉我怎么做?
由于
答案 0 :(得分:3)
如果是我,我会使用str.startswith('[')
将文件解析为多个部分,然后使用generator function将结果行传递给csv.reader()
和csv.DictReader()
这两个部分分别为。
以下是一个例子:
from csv import reader, DictReader
from pprint import pprint
def lines_until_section_mark(f):
for line in f:
if line.startswith('['):
break
if line.strip():
yield line
with open('cfg.txt') as f:
# Eat until first section mark
for line in lines_until_section_mark(f):
pass
# Construct first dictionary from first sectoin
d = dict(reader(lines_until_section_mark(f)))
# Construct second dictionary from second section
d['data'] = list(DictReader(lines_until_section_mark(f)))
pprint(d)
输入文件:
[section-1] # basically a setup info with <key-value> pair
date,2/16/2018
label,test3
size,25
[section-2] # contains test parameters and data
NO,parameter1,parameter2
1,50,30
2,-20,32
输出:
{'data': [{'NO': '1', 'parameter1': '50', 'parameter2': '30'},
{'NO': '2', 'parameter1': '-20', 'parameter2': '32'}],
'date': '2/16/2018',
'label': 'test3',
'size': '25'}
答案 1 :(得分:0)
要解析csv文件,您可能需要使用dataknead库。它仅适用于Python 3。
你可以这样安装:pip install dataknead
(如果你有不同的Python版本,则为pip3)
根据其文档,我们假设你有一个像这样的cities.csv:
city,country,population
Amsterdam,nl,850000
Rotterdam,nl,635000
Venice,it,265000
你可以这样读:
from dataknead import Knead
data = Knead("cities.csv").data()
打印(数据)的输出将是:
[{'city': 'Amsterdam', 'population': '850000', 'country': 'nl'}, {'city': 'Rotterdam', 'population': '635000', 'country': 'nl'}, {'city': 'Venice', 'population': '265000', 'country': 'it'}]
我建议你先解析一个部分。然后你可以决定如何划分文件的部分。希望这会有所帮助。
答案 2 :(得分:0)
如果你愿意使用熊猫,你可以做这样的事情。我在这里对数据做了一些假设。我假设大小值等于csv文件中的行数。我假设你知道日期以及你想用什么作为标签的名称。
此代码将为您提供csv文件中的行,并为每行创建一个字典并将其放入列表中。
import pandas as pd
my_dict = {"date": '06/01/2018', "label":"test3","size":0}
df = pd.read_csv('your_csv_file.csv')
row_list = []
for i, row in enumerate(df.values):
my_dict['size']+=1
row_dict = {}
for i in range(0, len(row)):
row_dict['col'+str(i)] = row[i]
row_list.append(row_dict)
my_dict["data"] = row_list
print(my_dict)