2017-06-27 45 views
0

我有JSON的list我打印出来是这样的:转换一个JSON清单到CSV文件在python

for item in points: 
    print(format(item)) 

结果看起来是这样的:

{u'TEMP': 30, u'LIGHT': 315, u'HUMIDITY': 30.9, u'SOURCE': u'arduino_1', u'PLACE': u'kitchen', u'time': u'2016-12-31T11:18:38.822822913Z'} 
{u'TEMP': 31, u'LIGHT': 325.5, u'HUMIDITY': 31.93, u'SOURCE': u'arduino_1', u'PLACE': u'garage', u'time': u'2016-12-31T11:18:39.919019993Z'} 
{u'TEMP': 32, u'LIGHT': 336, u'HUMIDITY': 32.96, u'SOURCE': u'arduino_1', u'PLACE': u'living_room', u'time': u'2016-12-31T11:18:41.014792508Z'} 
{u'TEMP': 33, u'LIGHT': 346.5, u'HUMIDITY': 33.99, u'SOURCE': u'arduino_1', u'PLACE': u'basement', u'time': u'2016-12-31T11:18:42.11100167Z'} 

首先,有是我的数据源在每个项目前打印'u'字符的问题。

我想写一个CSV文件中的每一行有这样的格式(第一行是CSV头)

TIME,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY 
2016-12-31T11:18:38.822822913Z,arduino_1,kitchen,30,315,30.9 

我试图做到这一点使用csv包。但我不知道我怎么能得到各行的数据列于清单中的项目和改变的顺序,他们出现在最终的CSV文件:

with open('output.csv', 'wb') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    writer.writerow(points) 

我会感激你的帮助对一个Python菜鸟。

+0

“首先,有一个与我的数据源的问题,打印每一个项目之前的‘U’字。”你为什么认为这是一个问题? – DeepSpace

+1

'DictWriter'是为你编写的一个csv文件的字典列表。 –

+0

@DeepSpace嗯那么'u'的含义是什么? –

回答

2

csv.writer是为列表或元组列表创建的。因此,将它用于字典列表会触发“期望序列”错误。相反,使用csv.DictWriter如下:

import csv 

data=[{u'TEMP': 30, u'LIGHT': 315, u'HUMIDITY': 30.9, u'SOURCE': u'arduino_1', u'PLACE': u'kitchen', u'time': u'2016-12-31T11:18:38.822822913Z'}, 
{u'TEMP': 31, u'LIGHT': 325.5, u'HUMIDITY': 31.93, u'SOURCE': u'arduino_1', u'PLACE': u'garage', u'time': u'2016-12-31T11:18:39.919019993Z'}, 
{u'TEMP': 32, u'LIGHT': 336, u'HUMIDITY': 32.96, u'SOURCE': u'arduino_1', u'PLACE': u'living_room', u'time': u'2016-12-31T11:18:41.014792508Z'}, 
{u'TEMP': 33, u'LIGHT': 346.5, u'HUMIDITY': 33.99, u'SOURCE': u'arduino_1', u'PLACE': u'basement', u'time': u'2016-12-31T11:18:42.11100167Z'}] 

with open("output.csv","w",newline="") as f: # python 2: open("output.csv","wb") 
    title = "time,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY".split(",") # quick hack 
    cw = csv.DictWriter(f,title,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
    cw.writeheader() 
    cw.writerows(data) 

固定标题顺序通过重用你提供的顺序(否则顺序是字典顺序,而不是你想要的)来完成。

编写标题以获取标题,然后在字典列表上使用writerows来写入数据。

输出:

time,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY 
2016-12-31T11:18:38.822822913Z,arduino_1,kitchen,30,315,30.9 
2016-12-31T11:18:39.919019993Z,arduino_1,garage,31,325.5,31.93 
2016-12-31T11:18:41.014792508Z,arduino_1,living_room,32,336,32.96 
2016-12-31T11:18:42.11100167Z,arduino_1,basement,33,346.5,33.99 

注意,u前缀是担心你没有出现在结果中。这只是一个表示角色。

1

Pandas有很多I/O工具来读/写许多文件。我想,你正试图将JSON文件转换为CSV。

所以,你可以这样做:

import pandas as pd 
data = pd.read_json(path_to_input_file) 
data.to_csv(path_to_csv_output_file)