2010-01-25 43 views
18

我知道我可以使用包含来自普通文件的Python代码 - 但我如何才能导入只是一个字典?如何从单独的文件导入或包含数据结构(例如字典)到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字典?

回答

27

只需导入它

import script 
print script.airportCode 

,或者更好的

from script import airportCode 
print airportCode 

只是小心地放在同一目录下两个脚本(或者做一个Python包,与__init__.py文件子目录;或放在PYTHONPATH上script.py的路径;但是这些是“高级选项”,只是把它放在同一个目录下就可以了)。

+3

这个答案的一般要点似乎是正确的,但是,使用OP的文件名。不应该是“导入myDict”,而不是“导入脚本”? – lreeder 2016-07-24 18:57:02

9

假设你import myDict的作品,你需要做到以下几点:

from myDict import airportCode 
1

那么,它并不需要是一个.py文件。你可以这样做:

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

虽然这是一个巨大的安全漏洞。

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

+1

如何在文件内容上调用'eval',而不是导入一个“漏洞安全漏洞”? – 2010-01-25 16:22:05

+3

因为'import'在被导入的模块的命名空间中完成了所有的工作,但是'eval()'可以做任何事情。*没有太大的实际区别。他们都很危险。 – 2010-01-25 16:39:34

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

如果myDict应该从Python模块在不同的目录中获取访问,你必须提供一个__init__.py模块。

有关该主题的更多信息,请参阅the Python documentation的模块章节。

1

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

小心:如果一个机场是在该列表两次,最后一次出现会默默“覆盖”以前的任何那些)。

+0

实际上,如果你用相同的密钥创建一个字典两次,第二个实例会默默覆盖第一个字段d = {1:2,2:4,1:3.5} >>> d {1 :3.5,2:4} – jcdyer 2010-01-25 15:23:31

+0

谢谢,我不知道(也不期望)。将编辑。 – 2010-01-25 15:31:27

+1

我很惊讶没有人建议JSON。在Python中使用JSON非常简单,数据结构看起来很像Python(但不完全一样)。 – 2015-09-03 14:23:31

2

当你在python中执行一个导入时,你实际上只是将名字引入你当前的命名空间。它并不真的不管那些名称是指这样:

from myDict import airportCode 

不管airportCode是否是一个函数,类或者只是一个场将作为你的情况。

0

使用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文件与机场和国际航空运输协会TLAs在机场和iatacode作为标题两列。

您也可以跳过字典,只需使用Reader和Writer而不是DictReader和DictWriter创建字符串。

默认情况下,csv模块会生成excel样式的csv,但您可以将任何您喜欢的方言设置为kwarg。

相关问题