2010-01-25 9 views
18

Sé que puedo incluir el código Python desde un archivo común usando , pero ¿cómo hago para importar solo un dict?Cómo importar o incluir estructuras de datos (por ejemplo, un dict) en un archivo Python desde un archivo separado

El problema que estoy tratando de resolver es que tengo un dict que debe estar en un archivo en una ubicación editable, mientras que el script real está en otro archivo. El dict también puede ser editado a mano, por un no programador.

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'} 

¿Cómo accedo a la dict airportCode desde dentro script.py?

Respuesta

27

Sólo importa que

import script 
print script.airportCode 

o, mejor

from script import airportCode 
print airportCode 

Sólo tenga cuidado de poner las dos secuencias de comandos en el mismo directorio (o hacer un paquete python, un subdirectorio con __init__.py archivo; o poner el camino a script.py en PYTHONPATH, pero estas son "opciones avanzadas", simplemente colócalo en el mismo directorio y estará bien).

+3

La esencia general de esta respuesta parece ser correcta, pero utilizando los nombres de archivo de OP. ¿No debería ser "import myDict", no "import script"? – lreeder

9

Asumiendo que su import myDict obras, tiene que hacer lo siguiente:

from myDict import airportCode 
1

Bueno, no tiene por qué ser un archivo .py. Simplemente podría hacer:

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

Es un agujero de seguridad enorme, sin embargo.

Otro módulo que quizás quiera consultar es csv para importar archivos CSV. Entonces tus usuarios podrían editarlo con una hoja de cálculo y no tienes que enseñarles la sintaxis de Python.

+1

¿Cómo se llama 'eval' al contenido de un archivo más que a un" agujero de seguridad abierto "que a su importación? –

+3

Porque 'import' hace todo su trabajo en el espacio de nombres del módulo que se está importando, pero' eval() 'puede hacer * cualquier cosa. * No hay mucha diferencia práctica; Ambos son bastante peligrosos. –

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

Si myDict hay que dejarse accede desde un módulo de Python en un directorio diferente, usted tiene que proporcionar un módulo __init__.py.

Para obtener más información sobre este tema, consulte el capítulo del módulo the Python documentation.

1

Si su dict tiene que ser editable a mano por un programador no programado, quizás podría tener más sentido utilizar un archivo CSV para esto. Entonces tu editor incluso puede usar Excel.

lo que puede utilizar:

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

para leer un archivo CSV como

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

cuidado: si un aeropuerto estaban en esa lista dos veces, la última aparición sería en silencio "sobrescribir" cualquier anterior uno (s)

+0

En realidad, si crea un dict con la misma clave dos veces, la segunda instancia sobrescribirá silenciosamente el primer >>> d = {1: 2, 2: 4, 1: 3.5} >>> d {1 : 3.5, 2: 4} – jcdyer

+0

Gracias, no sabía (ni esperaba) eso. Editaré –

+1

Estoy sorprendido de que nadie sugiera JSON. Es bastante fácil usar JSON en Python, y la estructura de datos se parece mucho (pero no exactamente igual) a la de Python. –

2

Cuando realiza una importación en python, realmente solo está insertando nombres en su espacio de nombre actual. Realmente no importa lo que esos nombres se refieren al modo:

from myDict import airportCode 

Trabajará independientemente de si airportCode es una función, clase o simplemente un campo como en su caso.

0

Usar csv. Se adhieren import csv con el resto de sus importaciones de módulos, y luego se puede hacer de la siguiente manera:

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

que debería darle una lista de diccionarios:

airport | iatacode 
__________________ 
Aberdeen| ABZ 

para crear el archivo csv:

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

que creará un archivo csv con aeropuertos y IATA TLA en dos columnas con el aeropuerto y iatacode como encabezados.

También puede omitir los dictados y simplemente tener cadenas utilizando Reader y Writer en lugar de DictReader y DictWriter.

De forma predeterminada, el módulo csv produce csv con estilo excel, pero puede establecer el dialecto que desee como kwarg.

Cuestiones relacionadas