用Python格式化的

时间:2018-06-01 17:33:37

标签: python csv dictionary

我有一个类似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很陌生。你认为这是转换这个文件的正确方向吗?谁能告诉我怎么做?

由于

3 个答案:

答案 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)