2009-12-14 10 views
10

Sagen wir, ich habe das folgende Wörterbuch in einer kleinen Anwendung.Variable in Datei schreiben, einschließlich Name

Was wäre, wenn ich die genaue Codezeile, mit dem Namen und alles, in eine Datei schreiben möchte. Gibt es eine Funktion in Python, die mich das tun lassen? Oder muss ich es zuerst in eine Zeichenfolge konvertieren? Kein Problem, es zu konvertieren, aber vielleicht gibt es einen einfacheren Weg.

Ich brauche keinen Weg, um es in eine Zeichenfolge zu konvertieren, die ich tun kann. Aber wenn es eine eingebaute Funktion gibt, die das für mich tut, würde ich es gerne wissen.

Um es klar zu machen, was ich in die Datei schreiben möchte, ist:

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

Vielleicht könnte man sagen, ein wenig mehr über * warum * Sie dies tun wollen? –

+0

Sorry, immer noch nicht klar. Meinst du, du willst nur wissen, wie man eine beliebige Zeichenkette in eine Datei schreibt? –

+0

Ich war nach dem Schreiben der gesamten Diktatzeile in eine Datei, einschließlich des Namens der dict-Variablen, wie in diesem Fall ist "dict". Das werden alle 27 Buchstaben sein. – Orjanp

Antwort

37

Die Funktion repr gibt eine Zeichenkette zurück, die die genaue Definition Ihres Diktats ist (außer für die Reihenfolge des Elements, dicts sind in Python ungeordnet). Leider kann ich keinen Weg finden, automatisch eine Zeichenfolge zu erhalten, die den Variablennamen darstellt.

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

Schreiben in eine Datei ist ziemlicher Standard, wie jede andere Datei schreiben:

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

@bryan: Es tut mir so leid, ich dachte fälschlicherweise, dass das Schreiben in eine Datei ziemlich offensichtlich ist ... seltsamerweise ist das nicht der Fall. –

+0

Danke, ich habe es so gemacht. In eine Datei zu schreiben war eigentlich kein Problem. – Orjanp

14

Verwendung pickle

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

und es wieder lesen

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

EDIT: Ich schätze, ich habe deine Frage falsch gelesen, tut mir leid ... aber Gurke könnte trotzdem helfen. :)

+0

Das schreibt das Diktat, aber nicht den Namen des Diktats. –

0

Die Standard-String-Darstellung für ein Wörterbuch genau richtig zu sein scheint:

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

Nicht sicher, ob Sie bei den „Variablennamen“ bekommen können, da Variablen in Python sind nur für Werte Etiketten. Siehe this question.

4

Sie tun können:

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 = ")] 

auch: stellen Sie sicher, nicht die dict builtin beschatten !

+0

Danke. Ich dachte nicht an die Schatten des Diktats. Putzen Sie etwas. – Orjanp

17

Ist etwas wie das, wonach Sie suchen?

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

Verbrauch:

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

Gute Sachen, wie lesen wir es jetzt zurück? – gatopeich

+0

Ich weiß, das ist ein alter Beitrag, aber gibt es einen Grund, dass Sie '_f' als Parameternamen verwenden? Ich frage speziell nach einem '_'. Ist das ein Style Guide oder nur eine persönliche Konvention? –

0

Wollen Sie nur wissen, wie eine Linie zu einem file zu schreiben? Zuerst müssen Sie die Datei öffnen:

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

Dann müssen Sie die Zeichenfolge in die Datei schreiben:

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

du für jede Zeile wiederholen kann (die +'\n' fügt eine neue Zeile, wenn Sie will es).

Schließlich müssen Sie die Datei schließen:

f.close() 

Sie können auch etwas klüger sein und verwenden with:

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

Dadurch wird die Datei automatisch schließen, auch wenn Ausnahmen ausgelöst werden .

Aber ich vermute, das ist nicht das, was Sie fragen ...

+0

Sie haben Recht. In eine Datei schreiben kann ich. :) – Orjanp