【问题标题】:Python CSV: One code but unfortunately two diffrent resultsPython CSV:一个代码,但不幸的是两个不同的结果
【发布时间】:2016-05-28 19:01:05
【问题描述】:

我对以下代码有疑问。我正在尝试从 CSV 文件中读取数据以创建嵌套字典。当我第一次运行它时,它完全符合我的意图,但是当我运行它两次时,它会改变输出的顺序。有谁知道为什么会这样?我正在使用 Python 3.4。

import csv

delimiter = ';'
result = {}

with open("F:\\Python Projects\\Database.csv", 'r') as data_file:
data = csv.reader(data_file, delimiter=delimiter)
headers = next(data)[1:]
for row in data:
    temp_dict = {}
    name = row[0]
    values = []
    for x in row[1:]:
        values.append(x)
    for i in range(len(values)):
        temp_dict[headers[i]] = values[i]
    result[name] = temp_dict    
print(result)

我的输入如下所示:

Input_CSV

结果是这样的:

Output

当我运行代码两次时,第 1 列显示了不同的顺序。

【问题讨论】:

  • 标准 Python 字典是无序的。即使您对 (key,value) 对进行了排序,您也无法以保留顺序的方式将它们存储在 dict 中。见stackoverflow.com/questions/9001509/…
  • 您可以按照@karasinski 链接的答案中的建议使用OrderedDict
  • 我不是要订购行,而是要订购列。在我看来,它应该有像我的 csv 文件一样的顺序,因为代码从头到尾都在运行,还是我错了?

标签: python csv dictionary


【解决方案1】:

来自the docs 我们有这个有用的说明:

CPython 实现细节:键和值以非随机的任意顺序列出,随 Python 实现而变化,并且取决于字典的插入和删除历史。

事实证明,如果您可以预测字典键的存储顺序,那么在 Web 应用程序上就有一种巧妙的攻击形式。击败这种聪明的攻击只需要简单地改变散列的工作方式,通过对每个散列使用随机“种子”。这使得字典排序变得不可预测,从而解决了聪明的攻击问题。但这意味着您不能每次转储字典的内容并以相同的顺序获得相同的结果。

您可以通过以下两种方式之一获得有序结果。首先,您可以使用collections.OrderedDict,或者(可能是更好的解决方案)您可以创建一个单独的排序阶段,在其中应用您想要的任何逻辑。

通常,单独的排序阶段如下所示:

for k,v in sorted(d.items()):
    print("\t{}: {}".format(k,v))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多