Как импортировать или включать структуры данных (например, словарь) в файл Python из отдельного файла

Я знаю, что могу включить код Python из общего файла, используя import MyModuleName, но как мне импортировать только словарь?

Проблема, которую я пытаюсь решить, заключается в том, что у меня есть словарь, который должен находиться в файле в редактируемом месте, а сам скрипт находится в другом файле. Диктовка также может быть отредактирована вручную непрограммистом.

script.py

airportName = 'BRISTOL'
myAirportCode = airportCode[airportName]

myDict.py

airportCode = {'ABERDEEN': 'ABZ', 'BELFAST INTERNATIONAL': 'BFS', 'BIRMINGHAM INTERNATIONAL': 'BHX', 'BIRMINGHAM INTL': 'BHX', 'BOURNMOUTH': 'BOH', 'BRISTOL': 'BRS'}

Как получить доступ к словарю airportCode из script.py?


person Pranab    schedule 25.01.2010    source источник


Ответы (7)


Просто импортируйте его

import myDict
print myDict.airportCode

или лучше

from myDict import airportCode
print airportCode

Просто будьте осторожны, поместите оба скрипта в один и тот же каталог (или создайте пакет python, подкаталог с файлом __init__.py; или укажите путь к script.py в PYTHONPATH; но это «дополнительные параметры», просто поместите его в тот же каталог, и все будет хорошо).

person Khelben    schedule 25.01.2010

Предполагая, что ваш import myDict работает, вам нужно сделать следующее:

from myDict import airportCode
person SilentGhost    schedule 25.01.2010

Когда вы выполняете импорт в python, вы просто загружаете имена в свое текущее пространство имен. На самом деле не имеет значения, к чему относятся эти имена:

from myDict import airportCode

Будет работать независимо от того, является ли airportCode функцией, классом или просто полем, как в вашем случае.

person Tendayi Mawushe    schedule 25.01.2010

Если ваш dict должен редактироваться вручную непрограммистом, возможно, было бы более целесообразно использовать для этого файл CSV. Тогда ваш редактор может даже использовать Excel.

Итак, вы можете использовать:

import csv
csvfile = csv.reader(open("airports.csv"))
airportCode = dict(csvfile)

чтобы прочитать файл CSV, например

"ABERDEEN","ABZ"
"BELFAST INTERNATIONAL","BFS"
"BIRMINGHAM INTERNATIONAL","BHX"
"BIRMINGHAM INTL","BHX"
"BOURNMOUTH","BOH"
"BRISTOL","BRS"

Осторожно: если бы аэропорт был в этом списке дважды, последнее вхождение молча «переписало бы» любой предыдущий.

person Tim Pietzcker    schedule 25.01.2010
comment
На самом деле, если дважды создать словарь с одним и тем же ключом, второй экземпляр молча перезапишет первый ››› d = {1:2, 2:4, 1:3.5} ››› d {1: 3.5, 2: 4} - person jcdyer; 25.01.2010
comment
Я удивлен, что никто не предложил JSON. Использовать JSON в Python довольно просто, а структура данных очень похожа (но не совсем на) на Python. - person Scott Prive; 03.09.2015

Ну, это не обязательно должен быть файл .py. Вы можете просто сделать:

eval(open("myDict").read())

Однако это зияющая дыра в безопасности.

Еще один модуль, на который вы, возможно, захотите обратить внимание, — это csv для импорта CSV-файлов. Тогда ваши пользователи смогут редактировать его с помощью электронной таблицы, и вам не придется обучать их синтаксису Python.

person Mike DeSimone    schedule 25.01.2010
comment
Почему вызов eval для содержимого файла представляет собой большую дыру в безопасности, чем его импорт? - person Robert Rossney; 25.01.2010
comment
Потому что import выполняет всю свою работу в пространстве имен импортируемого модуля, а eval() может делать все что угодно. Не так уж много практической разницы; они оба довольно опасны. - person Mike DeSimone; 25.01.2010

Используйте CSV-файл. Прикрепите import csv к остальным импортируемым модулям, а затем вы можете сделать следующее:

f = open('somefile.csv')
reader = csv.DictReader(f, (airport, iatacode))
for row in reader:
   print row

который должен дать вам список словарей:

airport | iatacode
__________________
Aberdeen| ABZ

для создания CSV-файла:

f = open('somefile.csv', 'w')
writer = csv.DictWriter(f, (airport, iatacode))
for row in airportcode:
   writer.writerow()
f.close()

который создаст файл csv с аэропортами и IATA TLA в двух столбцах с аэропортом и iatacode в качестве заголовков.

Вы также можете пропустить словари и просто иметь строки, используя Reader и Writer, а не DictReader и DictWriter.

По умолчанию модуль csv создает csv в стиле Excel, но вы можете установить любой диалект, который вам нравится, в качестве kwarg.

person user106514    schedule 25.01.2010

from myDict import airportCode
airportNode = 'BRISTOL'
myAirportCode = airportCode[airportName]

Если к myDict нужно получить доступ из модуля Python в другом каталоге, вы должны предоставить модуль __init__.py.

Для получения дополнительной информации по этой теме обратитесь к главе модуля документации Python.

person pi.    schedule 25.01.2010