CSV в JSON по тому же ключу-питону - PullRequest
0 голосов
/ 06 июля 2018

У меня есть большой CSV-файл (приблизительно 1 ГБ), который я хочу преобразовать в JSON-файл следующим образом:

CSV-файл имеет следующую структуру:

заголовок:tid;inkey;outkey;value

значения:

tid1;inkey1;outkey1;value1
tid1;inkey2;outkey2;value2
tid2;inkey2;outkey3;value2
tid2;inkey4;outkey3;value2

и т. Д.

Идея состоит в том, чтобы преобразовать этот CSV в JSON со следующей структурой, в основном, чтобы сгруппировать все по "TID":

{
"tid1":  {
    "inkeys":["inkey1", "inkey2"],
    "outkeys":["outkey1", "outkey2"]
         }
}

Я могу себе представить, как это сделать обычными диктонами и списками Python, но моя проблема также в огромном количестве данных, которые я должен обработать.Я полагаю, что панды могут помочь здесь, но я все еще очень запутался с этим инструментом.

Ответы [ 4 ]

0 голосов
/ 06 июля 2018

Аналогично другому defaultdict() ответ:

from collections import defaultdict

d = defaultdict(lambda: defaultdict(list))

with open('file.txt') as in_file:
    for line in in_file:
        tid, inkey, outkey, value = line.strip().split(';')
        d[tid]['inkeys'].append(inkey)
        d[tid]['outkeys'].append(outkey)
        d[tid]['values'].append(value)
0 голосов
/ 06 июля 2018

Я думаю, что это должно быть просто сделать со стандартными структурами данных Python, такими как defaultdict.Если у вас очень ограниченная память, я не вижу причин, по которым файл 1 ГБ будет проблематичным, если использовать прямой подход.

Что-то вроде (не тестировалось):

from collections import defaultdict
import csv 
import json

out_data = defaultdict(lambda: {"inkeys": [], "outkeys": [], "values": []})
with file("your-file.csv") as f:
    reader = csv.reader(f):
    for line in reader:
        tid, inkey, outkey, value = line
        out_data[tid]["inkeys"].append(inkey)
        out_data[tid]["outkeys"].append(outkey)
        out_data[tid]["values"].append(value)

print(json.dumps(out_data))

Возможно, есть более быстрый или более эффективный способ использования памяти с Pandas или другими, но простота и нулевые зависимости имеют большое значение,

0 голосов
/ 06 июля 2018

Вы можете использовать Панд с groupby и пониманием словаря:

from io import StringIO
import pandas as pd

mystr = StringIO("""tid1;inkey1;outkey1;value1
tid1;inkey2;outkey2;value2
tid2;inkey2;outkey3;value2
tid2;inkey4;outkey3;value2""")

# replace mystr with 'file.csv'
df = pd.read_csv(mystr, sep=';', header=None, names=['tid1', 'inkeys', 'outkeys'])

# group by index
grouper = df.groupby(level=0)

# nested dictionary comprehension with selected columns
res = {k: {col: v[col].tolist() for col in ('inkeys', 'outkeys')} for k, v in grouper}

print(res)

{'tid1': {'inkeys': ['outkey1', 'outkey2'], 'outkeys': ['value1', 'value2']},
 'tid2': {'inkeys': ['outkey3', 'outkey3'], 'outkeys': ['value2', 'value2']}}
0 голосов
/ 06 июля 2018

Сначала вам нужно использовать pandas и прочитать ваш CSV в кадр данных. Скажем, CSV сохраняется в файле с именем my_file.csv, а затем вы звоните

import pandas as pd    
my_df = pd.read_csv('my_file.csv')

Затем вам нужно преобразовать этот фрейм данных в указанную вами форму. Следующий вызов преобразует его в dict с указанной структурой

my_json = dict(my_df.set_index('tid1').groupby(level=0).apply(lambda  x : x.to_json(orient = 'records')))

Теперь вы можете экспортировать его в json файл, если хотите

import json
with open('my_json.json', 'w') as outfile:
    json.dump(my_json, outfile)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...