CSV, чтобы диктовать в Python - PullRequest
0 голосов
/ 01 июня 2018

У меня есть csv-подобный файл, который нужно передать в dict в Python.Вот пример файла:

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].

Я очень плохо знаком с Python.Как вы думаете, это правильное направление для преобразования этого файла?Может кто-нибудь сказать мне, как это сделать?

Спасибо

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Для разбора CSV-файла вы можете использовать библиотеку dataknead .Он работает только с Python 3.

Вы можете установить его так: pip install dataknead (pip3, если у вас разные версии Python)

В соответствии с документацией, давайте предположим, что у вас есть города.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'}]

Я предлагаювам сначала разобрать один раздел.Затем вы можете решить, как разделить раздел файла.Надеюсь, это поможет.

0 голосов
/ 01 июня 2018

Если вы хотите использовать панд, вы можете сделать что-то вроде этого.Я делаю несколько предположений о данных здесь.Я предполагаю, что значение размера равно количеству строк в вашем 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)
0 голосов
/ 01 июня 2018

Если бы это был я, я бы проанализировал файл на секции, используя str.startswith('['), а затем использовал функцию генератора , чтобы передать полученные строки в 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...