如何从另一个文件导入或包含数据结构(例如字典)到Python文件中

52
我知道可以使用 import MyModuleName 从一个常见的文件中包含 Python 代码,但是如何只导入一个字典呢?
我要解决的问题是,我有一个需要放在可编辑位置文件中的字典,而实际脚本在另一个文件中。这个字典也可能会被一个非程序员手动编辑。 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'}

我该如何在script.py中访问airportCode字典?

7个回答

78

只需导入它

import myDict
print myDict.airportCode

或者,更好的选择是

from myDict import airportCode
print airportCode

只需小心将两个脚本放在同一个目录下(或创建一个Python包,带有 __init__.py 文件的子目录; 或将 script.py 的路径放在 PYTHONPATH 中; 但这些是“高级选项”,只需将其放在同一个目录中即可。)


16

假设你的import myDict可行,你需要执行以下步骤:

from myDict import airportCode

2

好的,它不一定需要是一个.py文件。你可以这样做:

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

这是一个严重的安全漏洞。

另一个您可能想要查看的模块是csv,用于导入CSV文件。然后,您的用户可以使用电子表格编辑它,而不必教他们Python语法。


1
调用eval对文件内容的影响,与导入文件有何不同,会造成更大的“安全漏洞”? - Robert Rossney
3
因为import完成所有工作都在被导入模块的命名空间中进行,但是eval()可以做任何事情。实际上并没有太大的差异;它们都相当危险。 - Mike DeSimone

2
如果您的字典需要被非程序员手动编辑,也许使用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"

注意:如果一个机场在列表中出现两次,最后一次出现会默默地“覆盖”之前的任何一个(或多个)。


实际上,如果您创建一个具有相同键的字典两次,第二个实例将悄悄地覆盖第一个。>>> d = {1:2, 2:4, 1:3.5} >>> d {1: 3.5, 2: 4} - jcdyer
2
我很惊讶没有人建议使用JSON。在Python中使用JSON非常容易,数据结构看起来很像(但并不完全相同于)Python的数据结构。 - Scott Prive

2

当你在Python中执行导入操作时,实际上只是将名称引入到当前命名空间中。它并不真正关心这些名称所引用的内容,因此:

from myDict import airportCode

无论 airportCode 是一个函数、类还是像你的情况一样只是一个字段,都可以正常工作。


1

使用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()

这将创建一个包含机场和IATA TLAs的CSV文件,其中机场和iatacode为标题的两列。

您还可以通过使用Reader和Writer而不是DictReader和DictWriter来跳过字典并只使用字符串。

默认情况下,csv模块生成类似于Excel的csv,但您可以将任何方言设置为kwarg。


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

如果需要从不同目录的 Python 模块中访问 myDict,您必须提供一个 __init__.py 模块。
有关此主题的更多信息,请查看 Python 文档 的模块章节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接