Python:csv到json转换器值到密钥对

时间:2015-04-14 07:21:04

标签: python json csv python-3.x

去年我有一个Python初学者课程。现在我正在尝试将csv转换为json转换器。我已经搜索了一段时间并调整并更改了我找到的一些代码,直到输出看起来与我想要的类似。我使用的是Python 3.4.2。

@kvorobiev这是我的CSV的摘录,但它会适用于此案例。第一次转换将起作用。在第二次之后,您将看到标题的顺序将在json文件中更改。

csv文件看起来像这样

Document;Item;Category
4;10;C

截至目前我在输出文件中收到的内容(在应用kvorobiev的更改后):

[
{
    "Item": "10",
    "Category": "C",
    "Document": "4"
};
]

我想在输出文件中获取的json字符串应如下所示:

[
{
   "Document": "4",
   "Item": "10",
   "Category": "C"
},
]

您会注意到标题的顺序错误。

以下是代码:

import json
import csv

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

jsonfile.write('[' + '\n' + ' ')
fieldnames = csvfile.readline().replace('\n','').split(';')
num_lines = sum(1 for line in open('file.csv')) -1

reader = csv.DictReader(csvfile, fieldnames)
i = 0
for row in reader:  
  i += 1
  json.dump(row, jsonfile, indent=4,sort_keys=False)
  if i < num_lines:
    jsonfile.write(',')
  jsonfile.write('\n')
jsonfile.write(' ' + ']')

print('Done')

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

替换行

reader = csv.DictReader(csvfile, fieldnames)

reader = csv.DictReader(csvfile, fieldnames, delimiter=';')

此外,您打开file1.csv后来从file.csv

获取行号
num_lines = sum(1 for line in open('file.csv')) -2

您的解决方案可以简化为

import json
import csv
csvfile = open('file1.csv', 'r')
jsonfile = open('file1.csv'.replace('.csv','.json'), 'w')
jsonfile.write('{\n[\n')
fieldnames = csvfile.readline().replace('\n','').split(';')
reader = csv.DictReader(csvfile, fieldnames, delimiter=';')
for row in reader:  
  json.dump(row, jsonfile, indent=4)
  jsonfile.write(';\n')
jsonfile.write(']\n}')

如果要保存csv中列的顺序,可以使用

from collections import OrderedDict
...
for row in reader:  
  json.dump(OrderedDict([(f, row[f]) for f in fieldnames]), jsonfile, indent=4)
  jsonfile.write(';\n')
jsonfile.write(']\n}')