Чтение значений в виде списка из ini-файла выбирается случайным образом

У меня проблема с чтением некоторых значений из ini-файла в виде списка. Я сделал программу, которая принимает два списка в качестве параметров (источник, пункт назначения), а затем копирует исходные пути в пути назначения. Он получает эти пути из файла ini с именем paths.ini. Однако я заметил, что значения не были добавлены в хронологическом порядке, а это означало, что первое значение в файле ini не обязательно было первым значением в списке. Это критическая ошибка, поскольку я хочу, чтобы первый источник копировался только в первое место назначения.

Вот пример кода того, что я сделал:

try:
    src = list(dict(config.items('src')).values())
    dst = list(dict(config.items('dst')).values())
    print("src: "+ str(src) + " dst: "+ str(dst))


except Exception as e:
    messagebox.showerror("Data mismatch", "Mismatch between data from ini and core file")
    sys.exit(0)

if(utilFunctions.copyto(src, dst, True)):
    successCopy()
else:
    errorCopy()

Для тех, кто хочет увидеть ini-файл:

[src]
src1 = C:/Users/saUser/Documents/copyExample/singleCopies/1/2/3.txt
src2 = C:/Users/saUser/Documents/copyExample/singleCopies/1/2/3.txt


[dst]
dst1 = C:/Users/saUser/Documents/copyExample/singleCopies/1
dst2 = C:/Users/saUser/Documents/copyExample/singleCopies/1

person tomSurge    schedule 26.04.2016    source источник
comment
Словари в питоне (да и в большинстве языков) неупорядочены. Почему вы передаете свои config.items('...') вызовы через dict, а затем возвращаете их обратно в список?   -  person Hamms    schedule 26.04.2016
comment
@Hamms моя программа принимает два списка (источник, пункт назначения) в качестве параметров. Знаете ли вы лучший способ получить значения из ini-файла таким образом, чтобы элементы были упорядочены?   -  person tomSurge    schedule 26.04.2016
comment
@tomSurge Лучшим способом было бы ввести все источники/назначения в одной строке, разделенные известным символом (например, ','), а затем просто прочитать и разделить эту строку. Это приведет как к более простому коду, так и к возможности иметь переменное количество источников и мест назначения без необходимости изменения кода.   -  person DeepSpace    schedule 26.04.2016
comment
@tomSurge Да, ваша программа принимает два списка. Итак, почему вы используете dict?   -  person Hamms    schedule 26.04.2016
comment
@Hamms Поскольку мне нужны только значения, если я просто выполню list(config.items('src')) я также получу имя раздела.   -  person tomSurge    schedule 26.04.2016
comment
Я хочу сказать, что, приводя config.items к словарю, вы теряете его упорядоченный характер. Вы должны найти способ получить нужные вам значения из этого вызова, не используя для этого словарь. Ответ Хосе ниже предоставляет один из многих таких способов.   -  person Hamms    schedule 26.04.2016


Ответы (1)


Я думаю, вы используете встроенный ConfigParser. Согласно документации, которая использует collections.OrderedDict для хранения значений в ваших файлах, поэтому, хотя чтение выполняется последовательно, все должно быть в порядке, и вы получите упорядоченный словарь, представляющий содержимое вашего файла от [section] сверху вниз.

Если вам нужен список оттуда, просто не делайте того list(dict(..., что вы делаете. Лучше использовать понимание списка:

src = [value for key, value in config.items('src')]
dst = [value for key, value in config.items('dst')]

Тогда у вас будет то, что вы хотите, и заказанное, в ваших src и dst.

person José L. Patiño    schedule 26.04.2016
comment
Чистый, понятный и элегантный способ решения проблемы. Спасибо. - person tomSurge; 26.04.2016