@SG

: Dateien auf dem Hintergrundspeicher werden heute eigentlich immer im ”wahlfreien” Zugriff geöffnet, wobei die ”Record-Grösse” ein Byte ist. Das war früher mal etwas besonderes weil wahlfreier Zugriff nicht bei jedem Dateisystem oder Speichermedium (Bandlaufwerke), möglich oder üblich war und es spezielle Dateitypen für verschiedene Aufgaben gab. Der im verlinkten Forenbeitrag erwähnte C64 beziehungsweise die dort verwendeten Dateisysteme auf den Disketten können bei normalen Dateien zum Beispiel nicht beliebige Stellen in der Datei ansteuern ohne vom Anfang der Datei bis zu der Stelle zu lesen. Aber es gab spezielle Dateien mit denen man Datensätze fester Grösse direkt ansteuern kann. Dafür kann man mit diesen Dateien auch wirklich nur das machen und sie nicht wie andere Dateien Byte für Byte sequenziell lesen.
Get und Put musst Du Dir also mit `read()`, `write()`, und `seek()` selber basteln.
Feststellen ob die Datei auch von jemand anderem benutzt wird ist plattformübergreifend nicht so einfach, insbesondere weil der andere das auch absichern muss, es also nicht reicht das er die Datei öffnet, sondern dass er das auch ”ansagt”. Ausserdem gibt es gewisse Konstellationen mit ”Netzlaufwerken” bei denen das Sperren von Dateien nicht zuverlässig funktioniert.
Die Liste der Vorteile, beziehungsweise was sich sonst nur schwer lösen lässt, aus dem verlinkten Forenbeitrag, ist IMHO nicht ganz überzeugend. 1. Daten kann man auch anders speichern. 2. Daten kann man auch bei SQL-Datenbanken einfach als SQL-Dump per Mail weitergeben. Bei SQLite kann man auch die Datei weitergeben. 3. Mich hält ein einfaches flaches Dateiformat mit Datensätzen mit fester Länge nicht davon ab manuell einzugreifen. Und ich denke ich bin nicht der Einzige. 4. Der Aufwand ist verglichen mit fertigen Lösungen relativ hoch. 5. Welche Probleme mit Trennzeichen bei CSV? Darum kümmert sich das `csv`-Modul. 6. Unterschiedliche Datensatzlängen in CSV sind nur ein Problem wenn man wahlfreien Zugriff braucht ohne die Daten in den Speicher zu lesen.
Wie Sirius3 schon schrieb kann man sich so eine Datei mit Datensätzen fester länge mit dem `struct`-Modul und normalen Dateioperationen relativ einfach selber basteln. Bleibt alleine die Frage wozu das gut sein soll, weil man letztendlich dann sein eigenes DBMS schreibt, nur halt schlechter als das was es schon ausgereift und getestet gibt. SQLite3 ist Bestandteil der Python-Standardbibliothek, und auch `shelve`, `csv`, oder `json`, was man alles für kleine ”Datenbanken” verwenden kann. Wobei SQLite3 und `shelve` durchaus auch mit grösseren Datenmengen klar kommen können. Bei SQLite3 hätte man zudem den Vorteil eine SQL-Datenbank zu haben und die Daten deshalb auch auf ein grösseres DBMS umziehen zu können, wenn das nötig wird. Wenn man eine Abstraktionsschicht wie SQLAlchemy verwendet und nichts DB-spezifisches, geht das wahrscheinlich sogar recht problemlos.
Wenn man unbedingt eine Datei mit fester Datensatzgrösse haben möchte, würde ich auch nicht unbedingt selber etwas erfinden sondern etwas nehmen was auch in die 70er (oder davor) zurück geht, nämlich DBF-Dateien. Die können von den meisten Tabellenkalkulationen und Datenbank-GUIs in Office-Paketen verwendet werden. Ich würde so eine Datei aber nicht erstellen wenn ich nicht müsste, also wenn mich nicht eine andere Software dazu zwingt. Zum Beispiel sind DBF-Dateien Bestandteil von ESRI Shapefiles die man oft im GIS-Umfeld findet.