2009-12-14 16 views
10

Diciamo che ho il seguente dizionario in una piccola applicazione.Scrive la variabile nel file, incluso il nome

Cosa succede se si desidera scrivere la riga di codice esatto, con il nome del dettato e tutto, in un file. Esiste una funzione in python che mi permetta di farlo? O devo prima convertirlo in una stringa? Non è un problema convertirlo, ma forse c'è un modo più semplice.

Non ho bisogno di un modo per convertirlo in una stringa, che posso fare. Ma se c'è una funzione integrata che fa questo per me, mi piacerebbe saperlo.

Per chiarire, quello che vorrei scrivere nel file è:

write_to_file("dict = {'one': 1, 'two': 2}") 
+2

Forse si potrebbe dire qualcosa di più su * perché * si vuole fare questo? –

+0

Siamo spiacenti, non è ancora chiaro. Vuoi dire che vuoi solo sapere come scrivere una stringa arbitraria in un file? –

+0

Stavo scrivendo l'intera linea dict su un file, incluso il nome della variabile dict, come in questo caso è 'dict'. Saranno tutte le 27 lettere. – Orjanp

risposta

37

la funzione repr restituirà una stringa che è la definizione esatta del proprio dict (tranne che per l'ordine dell'elemento, i dit non sono ordinati in python). sfortunatamente, non posso dire in che modo ottenere automaticamente una stringa che rappresenta il nome della variabile.

>>> dict = {'one': 1, 'two': 2} 
>>> repr(dict) 
"{'two': 2, 'one': 1}" 

scrittura di un file è roba abbastanza standard, come qualsiasi altro file di scrittura:

f = open('file.py', 'w') 
f.write('dict = ' + repr(dict) + '\n') 
f.close() 
+0

@bryan: mi dispiace, ho pensato erroneamente che scrivere su un file fosse piuttosto ovvio ... stranamente, non è così. –

+0

Grazie, ho finito per farlo in questo modo. Scriverlo su un file non era in realtà un problema. – Orjanp

14

uso pickle

import pickle 
dict = {'one': 1, 'two': 2} 
file = open('dump.txt', 'w') 
pickle.dump(dict, file) 
file.close() 

e di leggerlo di nuovo

file = open('dump.txt', 'r') 
dict = pickle.load(file) 

EDIT: Immagino di aver letto male la tua domanda, scusa ... ma sottaceto potrebbe aiutare lo stesso. :)

+0

Questo scrive il dict, ma non il nome del dict. –

0

La rappresentazione stringa di default per un dizionario sembra essere giusto:

>>> a={3: 'foo', 17: 'bar' } 
>>> a 
{17: 'bar', 3: 'foo'} 
>>> print a 
{17: 'bar', 3: 'foo'} 
>>> print "a=", a 
a= {17: 'bar', 3: 'foo'} 

Non sono sicuro se è possibile ottenere presso il "nome della variabile", dal momento che le variabili in Python sono solo etichette per i valori. Vedi this question.

4

si potrebbe fare:

import inspect 

mydict = {'one': 1, 'two': 2} 

source = inspect.getsourcelines(inspect.getmodule(inspect.stack()[0][0]))[0] 
print [x for x in source if x.startswith("mydict = ")] 

anche: Assicurarsi di non ombra il builtin dict !

+0

Grazie. Non pensavo all'ombra di dict. Avere un po 'di pulizia da fare. – Orjanp

17

È qualcosa di simile quello che stai cercando?

def write_vars_to_file(_f, **vars): 
    for (name, val) in vars.items(): 
     _f.write("%s = %s\n" % (name, repr(val))) 

Usage:

>>> import sys 
>>> write_vars_to_file(sys.stdout, dict={'one': 1, 'two': 2}) 
dict = {'two': 2, 'one': 1} 
+2

Roba buona, ora come la rileggiamo? – gatopeich

+0

So che questo è un vecchio post, ma c'è un motivo per cui si usa '_f' come nome di parametro? Ti sto chiedendo specificatamente di usare un '_'. È questo in una guida di stile o solo una convenzione personale? –

0

Vuoi solo sapere come scrivere una riga a una file? In primo luogo, è necessario aprire il file:

f = open("filename.txt", 'w') 

Quindi, è necessario scrivere la stringa al file:

f.write("dict = {'one': 1, 'two': 2}" + '\n') 

È possibile ripetere questo per ogni linea (la +'\n' aggiunge una nuova riga se si lo voglio).

Infine, è necessario chiudere il file:

f.close() 

si può anche essere un po 'più intelligente e utilizzare with:

with open("filename.txt", 'w') as f: 
    f.write("dict = {'one': 1, 'two': 2}" + '\n') 
    ### repeat for all desired lines 

Questo chiude automaticamente il file, anche se eccezioni vengono sollevate .

Ma ho il sospetto non è questo quello che chiedete ...

+0

Sei corretto. Scrivere su un file che posso fare. :) – Orjanp

Problemi correlati