Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中读取.csv文件并转换为.json(具有不同的数据结构)?_Json_Mongodb_Python 2.7_Csv - Fatal编程技术网

如何在python中读取.csv文件并转换为.json(具有不同的数据结构)?

如何在python中读取.csv文件并转换为.json(具有不同的数据结构)?,json,mongodb,python-2.7,csv,Json,Mongodb,Python 2.7,Csv,尝试编写一个python脚本,允许我读取.csv文件,并将值混合到.json中的特定格式/数据结构中,然后导入mongoDB。我使用行人数据作为我的数据集,有超过一百万个条目包含冗余数据。我一直在写实际的脚本,并将其转换成我想要的.json格式 data.csv-表格格式,便于阅读和原始 因为我要上传到mongoDB,所以上下文中的Id对我来说是多余的,所以我需要脚本跳过它Sensor_ID不是唯一的,但我计划将其作为主键,并创建一个区分小时计数的对象列表 我的目标是从数据生成一个JSON对象

尝试编写一个python脚本,允许我读取.csv文件,并将值混合到.json中的特定格式/数据结构中,然后导入mongoDB。我使用行人数据作为我的数据集,有超过一百万个条目包含冗余数据。我一直在写实际的脚本,并将其转换成我想要的.json格式

data.csv-表格格式,便于阅读和原始

因为我要上传到mongoDB,所以上下文中的
Id
对我来说是多余的,所以我需要脚本跳过它
Sensor_ID
不是唯一的,但我计划将其作为主键,并创建一个区分
小时计数的对象列表

我的目标是从数据生成一个JSON对象,如下所示:

**data.json**

    {
        {
        "Sensor_ID": 4,
        "Sensor_Name": "Town Hall(West)",
        "countList": 
             [
                 {
                     "Date_Time": "01-JUN-2009 00:00",
                     "Year":2009,
                     "Month": "June",
                     "Mdate": 1,
                     "Day": "Monday",
                     "Time": 0,
                     "Hourly_Counts": 194
                 },
                 {
                     "Date_Time": "01-JUN-2009 00:00",
                     "Year":2009,
                     "Month": "June",
                     "Mdate": 1,
                     "Day": "Monday",
                     "Time": 1,
                     "Hourly_Counts": 82
                 }
             ]
        },
        {
        "Sensor_ID": 17,
        "Sensor_Name": "Collins Place(North)",
        "countList": 
             [
                 {
                     "Date_Time": "01-JUN-2009 00:00",
                     "Year":2009,
                     "Month": "June",
                     "Mdate": 1,
                     "Day": "Monday",
                     "Time": 0,
                     "Hourly_Counts": 21
                 }
             ]
        }
    }
诸如此类。我试图让它在读取
Sensor\u ID
时,从列出的字段创建一个json对象,并将其添加到
countList
。从
站点添加另一个_ID=4
计数列表

我正在使用Python2.7.x,我已经在stackoverflow和其他网站上查看了与此相关的所有问题。在转换为.json时,似乎很少有人愿意重新构造.csv数据,所以这有点困难

到目前为止,我对python还比较陌生,所以我认为这是一个很好的尝试

csvtojson.py

import csv
import json

def csvtojson():

    filename = 'data.csv'
    fieldnames = ('Id','Date_Time','Year','Month','Mdate','Day',
    'Time','Sensor_ID','Sensor_Name', 'Hourly_Counts')

    dataTime = ('Date_Time','Year','Month','Mdate','Day',
    'Time', 'Hourly_Counts')

    all_data = {}

    with open(filename, 'rb') as csvfile:
        reader = csv.DictReader(csvfile, fieldnames)
        #skip header
        next(reader)
        current_sensorID = None
        for row in reader:
            sensor_ID = row['Sensor_ID']
            sensorName = row['Sensor_Name']
            data = all_data[sensor_ID] = {}
            data['dataTime'] = dict((k, row[k]) for k in dataTime)


        print json.dumps(all_data, indent=4, sort_keys=True)    

if __name__ == "__main__":

    csvtojson()

据我所知,
countList
在is-own对象中,但它没有创建对象列表,可能会破坏到mongoDB的导入。它通过传感器ID进行过滤,但如果存在重复项,则会覆盖,而不是添加到计数列表中。而且我似乎无法获得我想要的格式/数据结构-我甚至不确定这是否是正确的结构,最终目标是像我列出的那样将数百万元组导入mongoDB。我现在正在尝试一个小集合来测试它。

请检查以下内容

使用“MongoDB_py.zip”文件

我将csv数据转换为MongoDB dict时也做了同样的操作

如果你有任何问题,请告诉我


谢谢

请检查以下内容

使用“MongoDB_py.zip”文件

我将csv数据转换为MongoDB dict时也做了同样的操作

如果你有任何问题,请告诉我


感谢

以下是使用python执行类似上述操作的示例代码。如果希望汇总数据以消除冗余数据,还可以在数据帧中进行一些聚合

import pandas as pd
import pprint as pp
import json
from collections import defaultdict

results = defaultdict(lambda: defaultdict(dict))

df = pd.read_csv('data.csv')
df.set_index(['Sensor_ID', 'Sensor_Name'],inplace=True)
df.reset_index(inplace=True)
grouped = df.groupby(['Sensor_ID', 'Sensor_Name']).apply(lambda x: x.drop(['Sensor_ID', 'Sensor_Name'], axis=1).to_json(orient='records'))
grouped.name = 'countList'
js = json.loads(pd.DataFrame(grouped).reset_index().to_json(orient='records'))
print json.dumps(js, indent = 4)
输出:

[
    {
        "Sensor_ID": 1, 
        "countList": "[{\"Id\":6,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":37}]", 
        "Sensor_Name": "Bourke Street Mall (North)"
    }, 
    {
        "Sensor_ID": 2, 
        "countList": "[{\"Id\":5,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":28}]", 
        "Sensor_Name": "Bourke Street Mall (South)"
    }, 
    {
        "Sensor_ID": 3, 
        "countList": "[{\"Id\":8,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":155}]", 
        "Sensor_Name": "Melbourne Central"
    }, 
    {
        "Sensor_ID": 4, 
        "countList": "[{\"Id\":1,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":194}]", 
        "Sensor_Name": "Town Hall (West)"
    },

下面是使用python执行类似上述操作的示例代码。如果希望汇总数据以消除冗余数据,还可以在数据帧中进行一些聚合

import pandas as pd
import pprint as pp
import json
from collections import defaultdict

results = defaultdict(lambda: defaultdict(dict))

df = pd.read_csv('data.csv')
df.set_index(['Sensor_ID', 'Sensor_Name'],inplace=True)
df.reset_index(inplace=True)
grouped = df.groupby(['Sensor_ID', 'Sensor_Name']).apply(lambda x: x.drop(['Sensor_ID', 'Sensor_Name'], axis=1).to_json(orient='records'))
grouped.name = 'countList'
js = json.loads(pd.DataFrame(grouped).reset_index().to_json(orient='records'))
print json.dumps(js, indent = 4)
输出:

[
    {
        "Sensor_ID": 1, 
        "countList": "[{\"Id\":6,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":37}]", 
        "Sensor_Name": "Bourke Street Mall (North)"
    }, 
    {
        "Sensor_ID": 2, 
        "countList": "[{\"Id\":5,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":28}]", 
        "Sensor_Name": "Bourke Street Mall (South)"
    }, 
    {
        "Sensor_ID": 3, 
        "countList": "[{\"Id\":8,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":155}]", 
        "Sensor_Name": "Melbourne Central"
    }, 
    {
        "Sensor_ID": 4, 
        "countList": "[{\"Id\":1,\"Date_Time\":\" 01-JUN-2009 00:00\",\"Year\":2009,\"Month\":\"June\",\"Mdate\":1,\"Day\":\"Monday\",\"Time\":0,\"Hourly_Counts\":194}]", 
        "Sensor_Name": "Town Hall (West)"
    },

您可以使用pandas
read_csv
将数据加载到数据帧中,执行所需的转换,然后使用
df.to_json
将其输出到所需的json结构中。您可以使用pandas
read_csv
将数据加载到数据帧中,执行所需的转换,然后使用
df.to_json
将其输出到所需的json结构中。我已经试过了,谢谢。字段名是否必须在列出的每个字段中,或者在没有字段名的情况下它是否可以导入mongoDB?嗯,这可能会有问题,具体取决于您导入数据的方式。您可以修改上面的代码以输出包含字段名的嵌套结构。我想说的是,在上面的索引中使用groupby,并使用
.to\ujson(orient='records')
选项将每个子集保存在字典中。我会帮你调查的。也许你会看到这个答案:我已经试过了,谢谢。字段名是否必须在列出的每个字段中,或者在没有字段名的情况下它是否可以导入mongoDB?嗯,这可能会有问题,具体取决于您导入数据的方式。您可以修改上面的代码以输出包含字段名的嵌套结构。我想说的是,在上面的索引中使用groupby,并使用
.to\ujson(orient='records')
选项将每个子集保存在字典中。我会帮你调查的。也许你会看到这个答案: