2015-08-11 6 views
0

Я пытаюсь преобразовать файл JSON в формат CSV (в памяти), чтобы передать его другому Transformer в Mulesoft. Вот отрывок из JSON:JSON to CSV - Python & cStringIO

[ 
{ 
"observationid": 1, 
"fkey_observation": 1, 
"value": 1, 
"participantid": null, 
"uom": "ppb", 
"finishtime": 1008585047000, 
"starttime": 1008581447000, 
"observedproperty": "NO2", 
"measuretime": 1008581567000, 
"measurementid": 1, 
"longitude": 3.1415, 
"identifier": "Test-1", 
"latitude": 10 
}, 
{ 
"observationid": 1, 
"fkey_observation": 1, 
"value": 12, 
"participantid": null, 
"uom": "ppb", 
"finishtime": 1008585047000, 
"starttime": 1008581447000, 
"observedproperty": "SO2", 
"measuretime": 1008582047000, 
"measurementid": 2, 
"longitude": 5, 
"identifier": "Test-1", 
"latitude": 11 
} 
] 

По существу, это должно создать CSV (в памяти) с 2-мя рядами, который выглядит следующим образом:

1,1,1,N,ppb,1008585047000,1008581447000,NO2,1008581567000,1,3.1415,Test-1,10 
1,1,12,N,ppb,1008585047000,1008581447000,SO2,1008582047000,2,5,Test-1,11 

В настоящее время выход выходит так , что неверно:

[1 1 1 None u'ppb' 1008585047000L 1008581447000L u'NO2' 1008581567000L 1 3.1415 u'Test-1' 10] 
[1 1 12 None u'ppb' 1008585047000L 1008581447000L u'SO2' 1008582047000L 2 5 u'Test-1' 11] 

Я считаю, что «и» бит относится к Unicode, но я не знаю, как изменить кодировку. Любая помощь будет принята с благодарностью!

Вот код Python У меня есть до сих пор:

import json 
import cStringIO 

f = open('test.json') 
data = json.load(f) 
f.close() 

output = cStringIO.StringIO() 
for item in data: 
    output.write(str([item['observationid'], item['fkey_observation'],  item['value'], item['participantid'], item['uom'], item['finishtime'], item['starttime'], item['observedproperty'], item['measuretime'],item['measurementid'], item['longitude'], item['identifier'], item['latitude']]) + '\n') 

contents = output.getvalue() 
print contents` 

EDIT

Привет, ребята, небольшие изменения плана. По сути, у меня есть объект типа String, но это на самом деле структурировано как JSON файл:

"[{observationid=1, fkey_observation=1, value=1, participantid=null, uom=ppb, finishtime=2001-12-17 10:30:47.0, starttime=2001-12-17 09:30:47.0, observedproperty=NO2, measuretime=2001-12-17 09:32:47.0, measurementid=1, longitude=3.1415, identifier=CITISENSE-Test-00000001, latitude=10}, {observationid=1, fkey_observation=1, value=12, participantid=null, uom=ppb, finishtime=2001-12-17 10:30:47.0, starttime=2001-12-17 09:30:47.0, observedproperty=SO2, measuretime=2001-12-17 09:40:47.0, measurementid=2, longitude=5, identifier=CITISENSE-Test-00000001, latitude=11}, {observationid=1, fkey_observation=1, value=7000, participantid=null, uom=ppb, finishtime=2001-12-17 10:30:47.0, starttime=2001-12-17 09:30:47.0, observedproperty=NO2, measuretime=2001-12-17 09:52:47.0, measurementid=3, longitude=6, identifier=CITISENSE-Test-00000001, latitude=9}, {observationid=2, fkey_observation=2, value=5, participantid=null, uom=ppb, finishtime=2001-12-18 10:30:47.0, starttime=2001-12-18 09:30:47.0, observedproperty=SO2, measuretime=2001-12-18 09:32:47.0, measurementid=4, longitude=7, identifier=CITISENSE-Test-00000001, latitude=8}, {observationid=2, fkey_observation=2, value=6, participantid=null, uom=ppb, finishtime=2001-12-18 10:30:47.0, starttime=2001-12-18 09:30:47.0, observedproperty=PM10, measuretime=2001-12-18 09:34:47.0, measurementid=5, longitude=8, identifier=CITISENSE-Test-00000001, latitude=10}, {observationid=3, fkey_observation=3, value=10000, participantid=null, uom=ppb, finishtime=2001-12-19 10:30:47.0, starttime=2001-12-19 09:30:47.0, observedproperty=SO2, measuretime=2001-12-19 09:38:47.0, measurementid=6, longitude=9, identifier=CITISENSE-Test-00000001, latitude=11.2}]" 

Как идти о преобразовании этого в CSV? Я не могу использовать json-модуль, поскольку он не является файлом JSON.

+0

Пожалуйста, покажите вашу работу, чтобы мы могли помочь –

+0

@HaiVu, я только что редактировали мой предыдущий пост и предоставил код Python. Благодаря! –

ответ

0

Возможно, вам стоит подумать об использовании чего-то вроде csvwriter. он будет обрабатывать настройку экранирования и разделителя для вас.

Смотрите пример Python3:

import csv 
with open('output.csv', 'w', newline='') as csvfile: 
    writer = csv.writer(csvfile, delimiter=',') 
    for line in data: 
     writer.writerow(line) 

он также может быть использован с cStringIO.

+1

Это работает для меня, спасибо огромное @Ereli и всем остальным! –

+0

@Jono_b Если вы нашли один из ответов удовлетворительным, рассмотрите [accepting] (https://stackoverflow.com/help/accepted-answer) его. – Ereli

0

Вот небольшой фрагмент, который я написал, я думаю, он должен обработать ваш сценарий и дать вам список списков. Эрели на что-то с этим модулем, но это может сделать вашу жизнь проще. Но тем временем, возможно, это поможет.

import json 
myFile = open('myJson.json','r+') 
myData = json.load(myFile) 
myFile.close() 

myList = [] 
for x in range(0,len(myData)): 
    myList.append([]) 
    for key in myData[x].keys(): 
     value = myData[x][key] 
     if isinstance(value,(str,unicode)): 
      value = value.encode('ascii','ignore') 
     myList[x].append(value) 

print myList 
1

Вот мой подход: использовать csv.DictWriter для обработки преобразования из словаря в строку данных CSV:

import csv 
import json 
from cStringIO import StringIO 

with open('test.json') as f: 
    my_data = json.load(f) 
    headers = [ 
     'observationid', 'fkey_observation', 'value', 
     'participantid', 'uom', 'finishtime', 'starttime', 
     'observedproperty', 'measuretime', 'measurementid', 
     'longitude', 'identifier', 'latitude'] 

    buffer = StringIO() 
    writer = csv.DictWriter(buffer, headers) 

    for row in my_data: 
     writer.writerow(row) 
    print buffer.getvalue() 
+1

headers = d.keys() – Wyrmwood

+0

@Wyrmwood - это не гарантирует заказ –

+1

использовать OrderedDict и object_pairs_hook – Wyrmwood