2016-07-19 19 views
0

Ich bin ein Anfänger Python-Programmierer, so dass die Antwort einfach sein kann. Allerdings habe ich mehrere Tage damit verbracht, diese Frage zu untersuchen, und ich bin ratlos. Dies ist auch mein erster Stack-Overflow-Post, also bitte sei nett, wenn ich hier eine Regel verletze. :)Python: Schreiben Sie ein Wörterbuch in eine Textdatei (CSV?) Und lesen Sie diese Textdatei in ein Wörterbuch

Mit Python möchte ich zwei Felder in mehreren Zeilen in eine neue Textdatei schreiben, und bei einem späteren Lauf lesen Sie diese Textdatei in ein neues Wörterbuch, um die vorherigen Werte zu referenzieren.

Ich teste den Code, den ich hier gefunden habe: Example code. Die angebotene Lösung hat 64 Ups und wird vom Fragesteller als beste Antwort markiert. So scheint es für die meisten Leute zu stimmen.

Mein Testcode erstellt erfolgreich ein erstes Wörterbuch mydict und speichert es in einer Textdatei. Wenn ich jedoch versuche, die Textdatei wieder in ein neues Wörterbuch zu schreiben mydict2, bekomme ich ... nichts ... nichts, keine Fehlermeldung oder irgendetwas, keine Ahnung, nur nichts.

Was fehlt mir hier?

Hier ist mein Testcode:

1,11 
2,22 
3,33 

Hier sind die Ergebnisse angezeigt, wenn ich laufen:

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

writer = csv.writer(open('dict.csv', 'wb')) 
for key, value in mydict.items(): 
    writer.writerow([key, value]) 

reader = csv.reader(open('dict.csv', 'rb')) 
mydict2 = dict(reader) 

print mydict2 

Hier sind die Inhalte der Textdatei, die es erstellt der Testcode lautet:

{1: 11, 2: 22, 3: 33} 
11 
{} 

Wie Sie in den ersten beiden Zeilen der Ergebnisausgabe sehen können, wird das ursprüngliche Ausgabewörterbuch mydict korrekt erstellt und zeigt einen referenzierten Wert an. Die dritte Ausgabezeile zeigt jedoch den Inhalt des neuen Wörterbuchs mydict2 an, das die Daten aus der Textdatei hätte lesen sollen. Der Inhalt der Textdatei wurde jedoch irgendwie nicht in das neue Wörterbuch gelesen, das leer ist.

Wie kann ich das beheben, um den Inhalt der Textdatei in das Wörterbuch zu laden?

Antwort

1

Das Problem schließt Ihre Dateien nicht. Ihre ursprüngliche Datei wurde nicht vollständig auf die Festplatte übertragen. Die with-Anweisung schließt Dateien automatisch, wenn der Block with beendet wird.

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

with open('dict.csv','wb') as f: 
    writer = csv.writer(f) 
    for key, value in mydict.items(): 
     writer.writerow([key, value]) 

with open('dict.csv','rb') as f: 
    reader = csv.reader(f) 
    mydict2 = dict(reader) 

print mydict2 

Ausgang:

{1: 11, 2: 22, 3: 33} 
11 
{'1': '11', '3': '33', '2': '22'} 
+0

Das war's! Es wurde angenommen, dass es sich um einen Dateikonflikt handeln könnte, aber es konnte kein kurzes Beispiel dafür gefunden werden, wie die Datei zwischen den Schreib- und Leseanweisungen geschlossen wird. Gerade recherchiert, dass einige mehr. Es gibt KEINE Möglichkeit, einen Leser direkt zu schließen. Suggested Syntax ist genau das, was Sie verwendet haben, die WITH-Anweisung. – dwwheelock

+0

@dwwheelock das Problem ist nicht Dateikonflikt, aber Pufferung: Daten werden nicht auf der Festplatte gespeichert, sobald Sie es schreiben, aber wenn es genug ist, um den Puffer zu füllen (wenn Sie sequentiell schreiben), oder wenn Sie einige Operationen ausführen auf der Datei, die es zwingt, den Inhalt zu spülen (suchen, flush, schließen, ...) Und yeah, Sie können den Leser nicht schließen (Sie können das vom Leser verwendete Dateiobjekt jedoch schließen). Ich habe mein ursprüngliches Beispiel geändert, um "mit" zu verwenden - ich wollte nur zeigen, wie man mit Wörterbüchern liest/schreibt, nicht um grundlegende Dateisemantik zu lehren ... –

+0

Danke, Ricardo, für den zusätzlichen Kommentar und die Aktualisierungen zu deinem Beispiel. – dwwheelock

0

Ich bin mir nicht sicher, ob das folgende überhaupt ist die eleganteste Antwort,, aber scheinbar einen absoluten Pfad zu der CSV-Datei liefern geholfen. Im Folgenden finden Sie das gewünschte Wörterbuchobjekt, das Sie aus dem von Ihnen erstellten CSV lesen können:

import csv 

mydict = {1:11,2:22,3:33} 
print(mydict) 
print(mydict[1]) 

with open('C:\\Python27\\dict.csv', 'wb') as writer: 
    writer = csv.writer(writer) 
    for item in mydict.items(): 
     writer.writerow(item) 

with open('C:\\Python27\\dict.csv', 'rb') as reader: 
    reader = csv.reader(reader) 
    for line in reader: 
     mydict2[int(line[0])] = int(line[1]) 
    #mydict2 = {line[0]:line[1] for line in reader} ...build mydict2 as a comprehension. 

print(mydict2) 

Best Luck!

+0

Das hilft. Danke, Jim. Ich brauchte nicht einmal den absoluten Pfad, aber die anderen Änderungen, die du gemacht hast, scheinen es zu funktionieren. Ich frage mich immer noch, warum dieser einfache Code für so viele Leute funktioniert hat, aber nicht für mich. Wenn jemand eine Idee dazu hat, bitte klingeln. – dwwheelock

0

Und dann diese gibt. Es schließt auch die Datei. Danke für die Coaching-Jungs!

import csv 

mydict = {1:11,2:22,3:33} 
print mydict 
print mydict[1] 

f = open('dict.csv', 'wb') 
writer = csv.writer(f) 
for key, value in mydict.items(): 
    writer.writerow([key, value]) 
f.close() 

f = open('dict.csv', 'rb') 
reader = csv.reader(f) 
mydict2 = dict(reader) 
f.close() 

print mydict2