Hallo zusammen,
ich muss ein paar dBase Dateien (Tabellen) bearbeiten.
Bin auf dbfpy gestoßen. Leider weiß ich nicht wie ich eine Zeile
löschen kann. Das lesen bzw. Inhalte verändern geht ohen Probleme.
leider ist mein Python-Kenniss auch nicht mächtig.
Hat jemand von euch Erfahrungen mit dbfpy?
Danke
dbfpy(dBase)-wie lösche ich Inhalte einer Tabelle?
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
http://dbfpy.cvs.sourceforge.net/viewvc ... iew=markup
Da gibts eine Methode delete() ... evtl. ist es das?
Da gibts eine Methode delete() ... evtl. ist es das?
Das habe ich auch schon entdeckt
Bzw. diese Methode "löscht" doch nicht oder?
Das objekt (was auch immer) wird ja nur als "deleted" markiert.
nur wie verwende ich diese Methode?def delete(self):
"""Mark method as deleted."""
self.deleted = True
Bzw. diese Methode "löscht" doch nicht oder?
Das objekt (was auch immer) wird ja nur als "deleted" markiert.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Das hat nichts mit Python zu tun, sondern ist ein Konzept aus dem DB Umfeld.satart hat geschrieben:sorry, ich kenn mich mit python noch nicht so gut aus:
was meinst du mit "commit"?
http://de.wikipedia.org/wiki/SQL#Transa ... d_Rollback
Das hat weniger mit Python als mit Datenbanken generell zu tun.
In diesem Fall könnte es aber sogar sein dass schon:reicht.
In diesem Fall könnte es aber sogar sein dass schon:
Code: Alles auswählen
del record['anyfield']
mein minimal code sieht so aus:
liefert:
liefert
AttributeError: __delitem__
Code: Alles auswählen
from dbfpy import dbf
db = dbf.Dbf("test.dbf")
print db[0]
db. close()
NAME: art (<type 'str'>)
SURNAME: Miller (<type 'str'>)
INITIALS: JM (<type 'str'>)
BIRTHDATE: 1983-04-05 (<type 'datetime.date'>)
Code: Alles auswählen
del db[0]
AttributeError: __delitem__
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Also wäre der workaround eigentlich nur der, eine bereits vorhandene DB einzulesen, die daten intern irgend wie zu mappen und dann nur die gewünschten in eine neue DB zurückzuschreiben, oder?
Wobei es hierbei ja doch nur um Nostalgie gehen kann? Wenn's nur darum geht, die Daten zu retten, sollte man das ganze am besten wirklich nur einlesen und dann in ein anderes RDBMS mappen.
Wobei es hierbei ja doch nur um Nostalgie gehen kann? Wenn's nur darum geht, die Daten zu retten, sollte man das ganze am besten wirklich nur einlesen und dann in ein anderes RDBMS mappen.
Wieso nur Nostalgie? DBF war mal ein sehr beliebtes Format, weil so schön einfach, da läuft sicher noch Unmengen an Individualsoftware mit.
@satart: Ich würde sagen einfach `delete()` und `store()` auf dem `DbfRecord`-Exemplar aufrufen.
Ja, dadurch wird der Datensatz nur als "gelöscht" markiert, aber so funktioniert das eben bei DBF-Dateien. Wirklich löschen würde nämlich bedeuten, dass alle Datensätze die danach kommen auf der Platte umkopiert werden müssten. Womit sich dann auch alle Recordnummern der betroffenen Datensätze ändern.
DBase kennt einen Befehl zum Entfernen der markierten Datensätze, den man alle Jubeljahre mal aufgerufen hat, um Platz zu schaffen. Der macht auch nichts anderes als die ganze Datenbank zu kopieren und dabei die als gelöscht markierten auszulassen.
Ja, dadurch wird der Datensatz nur als "gelöscht" markiert, aber so funktioniert das eben bei DBF-Dateien. Wirklich löschen würde nämlich bedeuten, dass alle Datensätze die danach kommen auf der Platte umkopiert werden müssten. Womit sich dann auch alle Recordnummern der betroffenen Datensätze ändern.
DBase kennt einen Befehl zum Entfernen der markierten Datensätze, den man alle Jubeljahre mal aufgerufen hat, um Platz zu schaffen. Der macht auch nichts anderes als die ganze Datenbank zu kopieren und dabei die als gelöscht markierten auszulassen.
-
- User
- Beiträge: 424
- Registriert: Montag 28. Juli 2003, 16:19
- Wohnort: /dev/reality
Ich habe gerade mal in meinem alten DBASE-Buch nachgesehen:
DELETE : Datensatz zum löschen markieren
RECALL : Löschmarkierung wieder aufheben
PACK : Datensatz aus DB löschen
ZAP : Alle Datensätze in der aktiven DB löschen
EDIT: Hilft leider nur direkt in DBASE
Dann wäre der einzige 'sinnvolle' Ansatz nur die gewünschten Daten aus Tabelle A zu selektieren und in Tabelle B zu schreiben.
hth, querdenker
DELETE : Datensatz zum löschen markieren
RECALL : Löschmarkierung wieder aufheben
PACK : Datensatz aus DB löschen
ZAP : Alle Datensätze in der aktiven DB löschen
EDIT: Hilft leider nur direkt in DBASE
Dann wäre der einzige 'sinnvolle' Ansatz nur die gewünschten Daten aus Tabelle A zu selektieren und in Tabelle B zu schreiben.
hth, querdenker
Wieso mit Java? Da hättest Du mit DBF das gleiche Problem. Das ist keine Einschränkung von Python sondern von DBF. Das ist ein total simples Dateiformat wo einfach nach einem Header der die Datensätze beschreibt, die Datensätze nacheinander in der Datei liegen. Und etwas mitten aus einer Datei zu löschen, ohne mindestens alles nachfolgende "nach vorne" zu kopieren, ist halt bei heutigen Dateisystemen nicht möglich. Da ändert auch die Programmiersprache nichts dran.
Ich habe noch nicht verstanden, warum du überhaupt eine eigene Anwendung dafür brauchst. Mit OpenOffice z.B. kannst du dBase-Dateien problemlos bearbeiten.satart hat geschrieben:Es gefällt mir überhaupt nicht, dass die Datenbank umkorpiert werden muss,
damit die Zeilen auch wirklich physikalisch gelöscht werden.
Ich werde mal mit Java probieren. Vielleicht lässt sich das ganze
eleganter lösen.
also,
ich will openoffice nicht verwenden, weil der zugriff auf dBase automatisiert werden soll.
Das ist ja auch der Grund warum ich dafür ein Programm schreiben muss.
Bei Java sieht nur etwas besser auch. Auch unter Java gibt es kaum dBase Klassen.
Zum Glück habe ich eine Klasse gefunden, das alle meiner Anforderungen enspricht.
http://www.heinerkuecker.de/DbfEdit.html
Besonders wichtig war es für mich dass die gelöschen Daten auch physikalisch gelöscht werden.
Mir fehlt halt die Zeit und Geduld das Rad neuzuerfinden.
Trotzdem habe ich hier sehr viel über dBase lernen können ....
vielen Dank an alle
ich will openoffice nicht verwenden, weil der zugriff auf dBase automatisiert werden soll.
Das ist ja auch der Grund warum ich dafür ein Programm schreiben muss.
Bei Java sieht nur etwas besser auch. Auch unter Java gibt es kaum dBase Klassen.
Zum Glück habe ich eine Klasse gefunden, das alle meiner Anforderungen enspricht.
http://www.heinerkuecker.de/DbfEdit.html
Besonders wichtig war es für mich dass die gelöschen Daten auch physikalisch gelöscht werden.
Mir fehlt halt die Zeit und Geduld das Rad neuzuerfinden.
Trotzdem habe ich hier sehr viel über dBase lernen können ....
vielen Dank an alle