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

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

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

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 ?

Ответы [ 7 ]

36 голосов
/ 25 января 2010

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

import script
print script.airportCode

или лучше

from script import airportCode
print airportCode

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

10 голосов
/ 25 января 2010

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

from myDict import airportCode
2 голосов
/ 25 января 2010

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

from myDict import airportCode

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

1 голос
/ 25 января 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-файл с аэропортами и TLA IATA в двух столбцах с заголовками airport и iatacode.

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

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

1 голос
/ 25 января 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"

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

1 голос
/ 25 января 2010

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

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

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

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

0 голосов
/ 25 января 2010
from myDict import airportCode
airportNode = 'BRISTOL'
myAirportCode = airportCode[airportName]

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...