Python CSV:一个代码但不幸的是两个不同的结果

时间:2016-05-28 19:01:06

标签: python csv dictionary

我遇到以下代码问题。我正在尝试从CSV文件中读取数据以创建嵌套的dictonary。当我第一次运行它时,它完全按照我的意图运行,但是当我运行它两次时,它会改变输出的顺序。有没有人知道为什么这是hapening?我正在使用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列显示了不同的顺序。

1 个答案:

答案 0 :(得分:0)

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

  

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

事实证明,如果您可以预测字典键的存储顺序,则可以在Web应用程序上进行一种聪明的攻击形式。击败这种聪明的攻击只需要通过使用一个随机的种子"来改变哈希的工作方式。每一个哈希。这使得字典排序变得不可预测,这解决了聪明的攻击问题。但这意味着你不能转储字典的内容,每次都以相同的顺序得到相同的结果。

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

通常情况下,单独的订购阶段将类似于:

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