2014-03-07 5 views
5

bekam ich diesen err:Fehler, wenn Daten in dbf in Python zu schreiben

DbfError: unable to modify fields individually except in with or Process() 

Wie es zu beheben?

Das ist mein Code:

with dbf.Table("aa.dbf") as table: 
    for record in table: 
    record[3] = 200 
+0

Ist die Einrückung, wie wir es richtig sehen? –

+0

aktualisiert noch.sorry. – UnZike

Antwort

5

dbf unterscheidet sich von den meisten anderen DB-Pakete, dass stattdessen eine völlig separate Datenstruktur zu bekommen (ein paar Zeilen als Tupel, zum Beispiel) Sie arbeiten direkt mit der dbf-Datei selbst.

Das Problem, das ich mich in Laufen fand, war, dass, wenn ich mehrere Felder auf einmal aktualisieren würde:

record.name = 'Some Name' 
record.age = current_year -birth_year 
record.hair_color = base_color * sun_tint 

, wenn ein Fehler jederzeit nach dem ersten Feld passiert hatte ich einen Datensatz, der nur teilweise aktualisiert wurde, und daher nicht mehr intern konsistent.

um dieses Problem zu bekommen ich Code hinzugefügt, die es Art von ist auf einer Basis pro Datensatz anwenden wollen, und die Art und Weise zu aktivieren es mit with oder mit Process ist:

with record: # capture current values 
    record.field1 = something 
    record.field2 = something_else 
    record.field3 = another_thing 
# now some other code 

Nun, wenn Ein Fehler tritt auf, die ursprünglichen Werte werden wiederhergestellt. Wenn kein Fehler auftritt, werden die neuen Werte in der Tabelle dbf auf dem Datenträger gespeichert.

Neben with auf einem Datensatz, können Sie auch Process auf einer Reihe von Aufzeichnungen verwenden, oder Sie könnten das Problem vermeiden und Ihre Daten außerhalb des Datensatz sammeln und schreiben sie dann alle auf einmal:

for record in table: 
    new_data = {} 
    new_data['field1'] = 'a name' 
    new_data['field2'] = an_age 
    dbf.write(record, new_data) 

So , um zu Ihrem Code zurückzukehren, der einfachste Weg, um es zu beheben ist wahrscheinlich:

with dbf.Table("aa.dbf") as table: 
    for record in dbf.Process(table): 
     record[3] = 200 
+0

cool, es ist sehr nett von dir.Thanks, Problem gelöst. dbf ist eine nette lib. – UnZike