2017-06-27 111 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)