如何在python中读取.csv文件并转换为.json(具有不同的数据结构)?
尝试编写一个python脚本,允许我读取.csv文件,并将值混合到.json中的特定格式/数据结构中,然后导入mongoDB。我使用行人数据作为我的数据集,有超过一百万个条目包含冗余数据。我一直在写实际的脚本,并将其转换成我想要的.json格式 data.csv-表格格式,便于阅读和原始 因为我要上传到mongoDB,所以上下文中的如何在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对象
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)"
},
您可以使用pandasread_csv
将数据加载到数据帧中,执行所需的转换,然后使用df.to_json
将其输出到所需的json结构中。您可以使用pandasread_csv
将数据加载到数据帧中,执行所需的转换,然后使用df.to_json
将其输出到所需的json结构中。我已经试过了,谢谢。字段名是否必须在列出的每个字段中,或者在没有字段名的情况下它是否可以导入mongoDB?嗯,这可能会有问题,具体取决于您导入数据的方式。您可以修改上面的代码以输出包含字段名的嵌套结构。我想说的是,在上面的索引中使用groupby,并使用.to\ujson(orient='records')
选项将每个子集保存在字典中。我会帮你调查的。也许你会看到这个答案:我已经试过了,谢谢。字段名是否必须在列出的每个字段中,或者在没有字段名的情况下它是否可以导入mongoDB?嗯,这可能会有问题,具体取决于您导入数据的方式。您可以修改上面的代码以输出包含字段名的嵌套结构。我想说的是,在上面的索引中使用groupby,并使用.to\ujson(orient='records')
选项将每个子集保存在字典中。我会帮你调查的。也许你会看到这个答案: