[英]Sorting CSV to be written into a JSON file in Python
我有一个CSV文件,该文件已使用Python脚本转换为JSON文件。 它可以工作,但我希望JSON具有与CSV文件相同的排序。 这是我尝试未成功的尝试:
#!/usr/bin/python
import csv
import json
CSV_PATH = './myFile.csv'
JSON_PATH = './myFile.json'
csv_file = csv.DictReader(open(CSV_PATH, 'r'))
json_list = []
for row in csv_file:
json_list.append(row)
sortedlist = sorted(json_list, key=lambda row:(row['id']), reverse=False)
file(JSON_PATH, 'w').write(json.dumps(
sortedlist, sort_keys=False, indent=2, separators=(',', ': '),
encoding="utf-8",ensure_ascii=False))
我的CSV如下所示:
id,name,lastname
1,John,Red
2,Steve,Brown
但是即使使用该lambda函数,创建的JSON也看起来像这样:
[
{
"name": "John",
"id": "1",
"lastname": "Red"
},
{
"name": "Steve",
"id": "2",
"lastname": "Brown"
}
]
我想要得到的是“ id”,“ name”,然后是“ lastname”。
字典不保留原始顺序。 您可能想尝试使用collection
模块中的OrderedDict
from collections import OrderedDict
my_dictionary=OrderedDict()
my_dictionary['foo']=3
my_dictionary['bar']=1
my_dictionary
OrderedDict([('foo', 3), ('bar', 1)])
它应该做的工作:
import json
from collections import OrderedDict
json.dumps(OrderedDict([("b", 1), ("a", 2), ("c", 2)]))
Out:'{“ b”:1,“ a”:2,“ c”:2}'
json.dumps({'b': 1, 'a': 2, 'c': 2})
Out:'{“ a”:2,“ c”:2,“ b”:1}'
如果要对字典进行重新排序,则Dictreader
fieldnames
用作位置参数:
FIELDNAMES = ['id', 'name', 'last_name']
csv_file = csv.DictReader(open(CSV_PATH, 'r'), fieldnames=FIELDNAMES)
json_list = []
for row in csv_file:
# Reorder according to your needs
data = OrderedDict([
('name', row['name']), ('last_name', row['last_name']), ('id', row['id'])])
json_list.append(data)
...
sorted
是对列表中的条目进行排序。 因此,如果您的原始列表是:
[
{
"name": "Steve",
"id": "2",
"surname": "Brown"
},
{
"name": "John",
"id": "1",
"surname": "Red"
}
]
它将以正确的顺序放置。 实际上,您的列表已经与CSV文件相同。 您的问题是列表中的每个条目都是字典,而字典不保留其元素的顺序。
使用collections.OrderedDict
来维护键的顺序:
import csv
import json
from collections import OrderedDict
CSV_PATH = 'myFile.csv'
JSON_PATH = 'myFile.json'
with open(CSV_PATH) as csv_file, open(JSON_PATH, 'w') as json_file:
reader = csv.DictReader(csv_file)
data = [OrderedDict((field, row[field]) for field in reader.fieldnames) for row in reader]
json.dump(data, json_file, indent=2, separators=(',', ': '), encoding="utf-8",ensure_ascii=False)
输入的CSV文件的输出:
[ { "id": "1", "name": "John", "surname": "Red" }, { "id": "2", "name": "Steve", "surname": "Brown" } ]
此代码遍历CSV文件的行,并创建OrderedDict
的列表。 键的顺序由DictReader
对象的fieldnames
列表维护。
然后优先于json.dumps()
使用json.dump()
将列表直接输出到文件,因为这样做稍微容易一些。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.