繁体   English   中英

用CSV对要写入JSON文件的CSV进行排序

[英]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)])

OrderedDict是可以记住首次插入键的顺序的字典。

它应该做的工作:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM