在 Python 3.3 中读取 JSON 文件的异常行为 [重复]

Posted

技术标签:

【中文标题】在 Python 3.3 中读取 JSON 文件的异常行为 [重复]【英文标题】:Estrange behavior reading JSON files in Python 3.3 [duplicate] 【发布时间】:2014-10-09 17:35:36 【问题描述】:

我正在使用“json”包来读取 JSON 文件并转换为 CSV。几个月前,我使用 Python 2.7 编写了一个脚本,该脚本提取了一个包含 JSON 文件中对象名称的字典(当时它运行良好)。 当我在 Python 3.3 中运行脚本时,每次执行脚本时检索对象的顺序都不同。

知道为什么会这样吗?以及如何解决?

我的脚本:

import json
import csv

   input_file = open('my_path\\json_file', 'r')
   myjson = json.load(input_f)
   input_f.close()
   new_json = myjson['markers'] #main object containing sub-objects

   keys =  #empty dictionary to store list of sub-objects

   for i in new_json:
       for k in i.keys():
           keys[k] = 1

一些输出示例:

执行 1:

KEYS'': 1, 'latitude': 1, 'Particles': 1, 'Wind Speed': 1, 'image': 1, 'Humidity': 1, 'C/ Daoiz y Velarde': 1, 'Noise': 1, 'Battery level': 1, 'id': 1, 'Soil Moisture': 1, ....

执行 2:

KEYS'': 1, 'Relative humidity': 1, 'N02': 1, 'Particles': 1, 'Rainfall': 1, 'image': 1, 'Odometer': 1, 'Co Index': 1, 'Wind Direction': 1, 'Atmospheric Pressure': 1, ....

【问题讨论】:

Python 的 dict 对象是无序的。我在上面链接的问题中的最佳答案将通过将 json 直接加载到 collections.OrderedDict 中来解决这个问题。 OT:我能问你为什么要将数据从 JSON 导出到 CSV 吗?换句话说,您希望通过这种转变实现的最终目标是什么? 我的最终目标是将从网站收集的数据准备到 PostgreSQL 中。需要订购和清洁(消除一些已知的不一致)。 【参考方案1】:

这是字典现在在 Python 3 中的工作方式。它是在 2.x 中默认禁用的安全补丁的结果。更多解释见this answer。

您可以通过使用object_pairs_hook 关键字参数来获得您想要的行为。将其传递给 collections.OrderedDict 类。您可能还希望将结果存储在 OrderedDict 中。这记录在 here 和 here 中。例如:

import json
import csv
import collections

input_file = open('my_path\\json_file', 'r')
myjson = json.load(input_f, object_pairs_hook=collections.OrderedDict)
input_f.close()
new_json = myjson['markers'] #main object containing sub-objects

keys = collections.OrderedDict()

for i in new_json:
    for k in i.keys():
        keys[k] = 1

【讨论】:

【参考方案2】:

发生这种情况是因为 保证对 python 字典进行排序。使用有序字典来修复它:

import json
import csv
from collections import OrderedDict

input_file = open('my_path\\json_file, 'r')
myjson = OrderedDict(json.load(input_f))
input_f.close()
keys =  #empty dictionary to store list of sub-objects

for i in new_json:
    for k in i.keys():
       keys[k] = 1

【讨论】:

我认为这不会保留存储在磁盘上的文件中的顺序,因为它最初仍被加载到普通的 dict 中。 OP 如果他想在磁盘上将其格式化输出,他们只需要使用 json.dumps 或其他方式将其写出来。

以上是关于在 Python 3.3 中读取 JSON 文件的异常行为 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Python 包中读取 JSON 文件

python - 如何在python中附加一个列表时处理异常,其中包含从存储从.json文件读取的数据的dict读取的数据?

在 Python 3.4 中加载和读取具有多个 JSON 对象的 JSON 文件

我如何在python中读取JSON对象?

Python:如何从压缩的 json .gz 文件中读取并写入 json 文件

如何在python中读取json对象[重复]