2010-01-25 13 views
18

So di poter includere il codice Python da un file comune usando - ma come faccio a importare solo un dict?Come importare o includere strutture di dati (ad es. Un dict) in un file Python da un file separato

Il problema che sto cercando di risolvere è che ho un codice che deve trovarsi in un file in una posizione modificabile, mentre lo script attuale si trova in un altro file. Il dict potrebbe anche essere modificato a mano, da un non programmatore.

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

Come posso accedere al airportCode dict dall'interno script.py?

risposta

27

Basta importare lo

import script 
print script.airportCode 

o, meglio

from script import airportCode 
print airportCode 

Basta essere attenti a mettere entrambi gli script nella stessa directory (o fare un pacchetto python, un subdir con __init__.py di file; o mettere il percorso per script.py sul PYTHONPATH, ma queste sono "opzioni avanzate", basta metterlo nella stessa directory e andrà bene).

+3

L'essenza generale di questa risposta sembra essere corretta, ma, usando i nomi dei file dell'OP. non dovrebbe essere "import myDict", non "import script"? – lreeder

9

Assumendo che il import myDict opere, è necessario effettuare le seguenti operazioni:

from myDict import airportCode 
1

Beh, non ha bisogno di essere un file .py. Si può solo fare:

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

E 'un grosso problema di sicurezza, però.

Un altro modulo che si desidera esaminare è csv per l'importazione di file CSV. Quindi i tuoi utenti possono modificarlo con un foglio di calcolo e non devi insegnare loro la sintassi Python.

+1

Come si chiama 'eval' sul contenuto di un file più di un" buco di sicurezza spalancato "dell'importazione? –

+3

Poiché 'import' fa tutto il suo lavoro nello spazio dei nomi del modulo che viene importato, ma eval()' può fare qualsiasi cosa *. Non c'è molta differenza pratica; sono entrambi piuttosto pericolosi. –

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

Se myDict dovrebbe ottenere accede da un modulo Python in una directory diversa, è necessario fornire un modulo __init__.py.

Per ulteriori informazioni su questo argomento consultare il capitolo del modulo the Python documentation.

1

Se il tuo dict deve essere modificabile manualmente da un non programmatore, forse potrebbe avere più senso usare un file CSV per questo. Quindi l'editor può persino usare Excel.

modo da poter utilizzare:

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

di leggere un file CSV come

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

attenzione: se un aeroporto fosse in quella lista per due volte, l'ultima occorrenza sarebbe silenziosamente "sovrascrivere" qualsiasi precedente uno (s).

+0

In realtà, se si crea un dt con la stessa chiave due volte, la seconda istanza sovrascriverà automaticamente il primo >>> d = {1: 2, 2: 4, 1: 3.5} >>> d {1 : 3.5, 2: 4} – jcdyer

+0

Grazie, non sapevo (né me lo aspettavo). Modificherà. –

+1

Sono sorpreso che nessuno abbia suggerito JSON. È piuttosto semplice usare JSON in Python e la struttura dei dati sembra molto simile (ma non esattamente la stessa) di Python. –

2

Quando si esegue un'importazione in python si stanno solo inserendo i nomi nello spazio dei nomi corrente. Non ha molta importanza ciò che questi nomi si riferiscono a così:

from myDict import airportCode 

Lavoreranno indipendentemente dal fatto che airportCode è una funzione, di classe o semplicemente un campo come nel tuo caso.

0

Utilizzare csv. Stick import csv con il resto dei tuoi importazioni di moduli, e quindi si può procedere come segue:

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

che dovrebbe dare un elenco di dizionari:

airport | iatacode 
__________________ 
Aberdeen| ABZ 

Per creare il file CSV:

che creerà un file csv con aeroporti e TLA IATA in due colonne con aeroporto e iatacode come intestazioni.

È anche possibile saltare i dicts e creare stringhe utilizzando Reader e Writer anziché DictReader e DictWriter.

Per impostazione predefinita, il modulo csv produce csv in stile excel, ma è possibile impostare qualsiasi dialetto che si desidera come kwarg.

Problemi correlati