通过同一个keypthon将Csv转换为json

2024-04-29 04:04:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个很大的csv文件(aprx。1GB),我想通过以下方式转换为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”分组:

^{pr2}$

我可以想象如何使用普通的python dict和list,但是我的问题是我必须处理大量的数据。我想熊猫能帮上忙,但我对这个工具还是很困惑。在


Tags: 文件csvjson标题方式结构tidvalue2
3条回答

可以将Pandas与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']}}

首先,您需要使用^{cd1>}并将csv读入数据帧。假设csv保存在名为^{{cd2>}的文件中,然后调用

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

然后,您需要将此数据帧转换为指定的表单。下面的调用将将其转换为具有指定结构的^{cd3>}

^{pr2}$

现在,如果您想,可以将其导出到^{cd4>}文件

^{pr3}$

我认为对于标准的Python数据结构,比如defaultdict,这应该是直接的。除非内存非常有限,否则我看不出1gb文件使用直接方法会有问题的原因。在

类似(未测试):

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或其他人的问题,但是简单和零依赖性会有很长的路要走。在

相关问题 更多 >