2015-08-22 2 views
0

Базовый сценарий python csv для json получает столбец, смешанный в финальном JSON. Любая идея почему?Python csv to json column order

test.csv

animal,age,count,legs 
dogs,3,5,4 
cats,6,4,4 
birds,2,1,2 

сценарий

import csv 
import json 

csvfile = open('test.csv', 'r') 
jsonfile = open('test.json', 'w') 

reader = csv.DictReader(csvfile) 

jsonfile.write('[') 
for row in reader: 
    json.dump(row, jsonfile) 
    jsonfile.write(',\n') 
jsonfile.write(']') 

test.json

[{"count": "5", "age": "3", "legs": "4", "animal": "dogs"}, 
{"count": "4", "age": "6", "legs": "4", "animal": "cats"}, 
{"count": "1", "age": "2", "legs": "2", "animal": "birds"}, 
] 
+0

Вы можете использовать это, чтобы получить упорядоченный словарь http://pymotw.com/2/collections/ordereddict. html – Khalsa

+0

json не заказывается. и не является питоновым. – njzk2

+0

@ njzk2 делает это как 'Object.keys (json [0])' is – geotheory

ответ

4

Это происходит потому, что Dictionar y не имеет никакого смысла порядка, поэтому ожидается, что словари находятся в произвольном порядке.

Если вы должны сохранить заказ (и в идеале вам не нужно), вам нужно будет прочитать каждую строку с помощью простого чтения csv, а затем создать объекты collection.OrderedDict, которые сохраняют порядок, в котором будут добавлены ключи. Пример -

from collections import OrderedDict 
import csv 
with open('test.csv','r') as f: 
    reader = csv.reader(f) 
    headerlist = next(reader) 
    csvlist = [] 
    for row in reader: 
      d = OrderedDict() 
      for i, x in enumerate(row): 
        d[headerlist[i]] = x 
      csvlist.append(d) 

import json 
with open('test.json','w') as f: 
    json.dump(csvlist,f) 

Обратите внимание, это все равно будет бесполезно, если анализатор, который будет использовать этот JSON не уважает порядок таким же образом.


Пример/Demo -

С моим test.csv, как -

animal,age,count,legs 
dogs,3,5,4 
cats,6,4,4 
birds,2,1,2 

test.json выглядел -

[{"animal": "dogs", "age": "3", "count": "5", "legs": "4"}, 
{"animal": "cats", "age": "6", "count": "4", "legs": "4"}, 
{"animal": "birds", "age": "2", "count": "1", "legs": "2"}] 
+0

Это может помочь http://stackoverflow.com/a/6921760/16959 –

+0

Но почему это давая строки в том же порядке каждый раз – The6thSense

+0

@VigneshKalai. Порядок дикта не случайный, он просто не соответствует ожидаемому порядку. –

3

В ответ Ананда вы только временно решить проблему. Файл JSON может выводиться в правильном порядке, но тогда вы можете прочитать эти данные в другом месте (например, в браузере или другом процессе Python), и когда он будет читаться в этом файле, порядок не будет сохранен!

Для того чтобы заказать заказ между источником данных и пунктом назначения, вам необходимо использовать список .

Вы можете сделать следующее, чтобы сохранить порядок:

import csv 
import json 

lst = [] 
csvfile = open('test.csv', 'r') 
jsonfile = open('test.json', 'w') 
first_line = next(csvfile).split(',') 

csvfile.seek(0) # we peeked at the first_line, lets reset back to beginning 

reader = csv.DictReader(csvfile) 

for row in reader: 
    group = [] 
    for h in first_line: 
     h = h.strip() 
     group.append([h, row[h]]) 
    lst.append(group) 

jsonfile.write(json.dumps(lst)) 

Выход:

[[["animal", "dogs"], ["age", "3"], ["count", "5"], ["legs", "4"]], [["animal", "cats"], ["age", "6"], ["count", "4"], ["legs", "4"]], [["animal", "birds"], ["age", "2"], ["count", "1"], ["legs", "2"]]] 
+0

Отмечено. Спасибо за совет – geotheory