Python CSV: один код, но, к сожалению, два разных результата

У меня проблемы со следующим кодом. Я пытаюсь прочитать данные из CSV-файла, чтобы создать вложенный диктонарий. Когда я запускаю его в первый раз, он делает именно то, что я намереваюсь, но когда я запускаю его дважды, он изменяет порядок вывода. У кого-нибудь есть идея, почему это происходит? Я использую Python 3.4.

import csv

delimiter = ';'
result = {}

with open("F:Python ProjectsDatabase.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

и результат такой:

Выход

В столбце 1 показан другой порядок при выполнении кода дважды.

1 ответ

  1. Из документов у нас есть это полезное Примечание:

    CPython детали реализации: ключи и значения перечислены в произвольном порядке, который является неслучайным, варьируется в реализациях Python, и зависит от истории вставки и удаления словаря.

    Оказывается, существует хитроумная форма атаки, которая возможна в веб-приложениях, если вы можете предсказать порядок, в котором будут храниться ключи словаря. Победа над этой умной атакой включает в себя просто изменение способа работы хэширования, используя случайное «семя» с каждым хэшем. Это делает порядок словарей непредсказуемым, что решает проблему умной атаки. Но это означает, что вы не можете сбрасывать содержимое словаря и получать одни и те же результаты в одном и том же порядке каждый раз.

    Вы можете получить упорядоченный результат одним из двух способов. Во-первых , вы могли бы использоватьcollections.OrderedDict, или (вероятно, лучшее решение) вы могли бы сделать отдельный этап заказа, где вы применяете любую логику, которую вы хотите.

    Нормально, отдельно приказывая участок посмотрит что-то как:

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