FlatTree vom Dateisystem
Ja, "pickles" sind erstmal ziemlich Python-spezifisch. Es spricht ja auch nichts gegen XML als Format, man muss halt nur aufpassen das man Binärdaten entsprechend kodiert.
Hast du vielleicht noch einen Tipp, wie man das vernünftig umsetzen könnte? Auch alle lesbaren Zeichen als Binär-Strings zu schreiben halte ich für unsinnig. In den wenigsten Fällen haben Dateien solche 'verkrüppelten' Namen. Aber auch diese Fälle möchte ich berücksichtigen.BlackJack hat geschrieben:man muss halt nur aufpassen das man Binärdaten entsprechend kodiert
Daher sollte man den Dateinamen vielleicht vorher auf Binärzeichen untersuchen. Wenn er aus solchen besteht, konvertiert man den gesamten Namen, ansonsten bleiben es Zeichen aus dem UTF-8 Zeichensatz. Im XML-Code steht dann eben:
<file name="\xf4\xf5\xf6" binary="yes" />
Ne Idee?
Eine gute Standardkodierung wäre wohl "Quoted Printable". Das wird aus ähnlichen Gründen bei E-Mail verwendet. Ist in Python auch sehr einfach umsetzbar:
Das kannst Du einfach grundsätzlich machen. ASCII-Buchstaben bleiben dabei auch kodiert noch lesbar und, zumindest in den meisten westlichen Ländern, bestehen Dateinamen zu einem sehr grossen Teil aus ASCII-Zeichen.
Oder Du nimmst 'string-escape' als Kodierung:
Code: Alles auswählen
In [56]: '\001\n\b\t\aabcdef\xff'.encode('quoted-printable')
Out[56]: '=01\n=08=09=07abcdef=FF'
In [57]: _.decode('quoted-printable')
Out[57]: '\x01\n\x08\t\x07abcdef\xff'
Oder Du nimmst 'string-escape' als Kodierung:
Code: Alles auswählen
In [60]: print 'Brief an Manfred Müller.rtf'.encode('string-escape')
Brief an Manfred M\xc3\xbcller.rtf
Was ist besser oder geeigneter?BlackJack hat geschrieben:Eine gute Standardkodierung wäre wohl "Quoted Printable" [...] Oder Du nimmst 'string-escape' als Kodierung
Habe mich im Ürbigen nochmal an den `FlatTree` gewagt und dabei an Leonidas' Code-Snippet orientiert. Hat ne Weile gedauert, bis ich raus hatte, warum in meinem Python 2.4 das import xml.etree.ElementTree nicht geklappt hat... Der `ElementTree` scheint doch schon genau das zu können was ich mir so mühselig zusammengekrazt habe... und eigentlich noch mehr, weil er ja gleich für XML gedacht ist. Daher mal meine Idee dazu hier: Paste #540
Es entsteht:
Code: Alles auswählen
<Snapshot>
<FileSystem>
<File ID="1" Name="" Type="Drive"/>
<File ID="2" Name="boot" ParentID="1" Type="Directory"/>
<File ID="3" Name="grub" ParentID="2" Type="Directory"/>
<File ID="4" MTime="1167775095" Name="menu.lst" ParentID="3" Size="3893" Type="File"/>
</FileSystem>
<WindowsRegistry/>
</Snapshot>
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Paar Anmerkungen: Deine Benennung ist nicht PEP8 konform und ich denke ich hätte die Konstanten aus der Klasse rausgezogen. Ich denke dass man CreateID in der Klasse gar nicht braucht und das diese als Generator besser gelöst werden kann. Schließlich erwartet man ja sequenzille IDs. In Zeile 66 brauchst du nicht auf walk == True zu testen, sondern nur auf walk.
Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit. Rekursionen sind natürlich selbst noch einmal Speicherfressend.
Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit. Rekursionen sind natürlich selbst noch einmal Speicherfressend.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Weil? Meinst du nach `__init__` verschieben oder komplett aus der Klasse raus?Leonidas hat geschrieben:und ich denke ich hätte die Konstanten aus der Klasse rausgezogen.
Was ist ein Generator?Leonidas hat geschrieben:Ich denke dass man CreateID in der Klasse gar nicht braucht und das diese als Generator besser gelöst werden kann. Schließlich erwartet man ja sequenzille IDs.
`os.walk()` macht eigentlich genau dasselbe.Leonidas hat geschrieben:Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Ich würde es aus der Klasse rausholen.droptix hat geschrieben:Weil? Meinst du nach `__init__` verschieben oder komplett aus der Klasse raus?
Das ist das was ich in Zeile 34 bis 40 in meinem Code habe. Ich definiere eine Funktion die unendlich lange läuft und IDs ausgibt und sich 'schlafen' legt. Beim nächsten Aufruf von .next() (Zeile 9) wird die Funktion dann um eine Iteration fortgesetzt, gibt wieder eine ID aus und 'schläft' weiter.droptix hat geschrieben:Was ist ein Generator?Leonidas hat geschrieben:Ich denke dass man CreateID in der Klasse gar nicht braucht und das diese als Generator besser gelöst werden kann. Schließlich erwartet man ja sequenzille IDs.
Stimmt, hast recht. Ich denke aber, dass das Speichern von 20 os.walk() Zuständen die sich rekursiv Aufgerufen haben, speicherschonender ist als das Speichern von 20 AddFileSystemItem() Zuständen.droptix hat geschrieben:`os.walk()` macht eigentlich genau dasselbe.Leonidas hat geschrieben:Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit.
Ich kann mich aber auch irren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice