FlatTree vom Dateisystem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

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.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

BlackJack hat geschrieben: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.

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?
BlackJack

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:

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'
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 [60]: print 'Brief an Manfred Müller.rtf'.encode('string-escape')
Brief an Manfred M\xc3\xbcller.rtf
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

BlackJack hat geschrieben:Eine gute Standardkodierung wäre wohl "Quoted Printable" [...] Oder Du nimmst 'string-escape' als Kodierung
Was ist besser oder geeigneter?

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... :twisted: 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>
EDIT: Ich stelle gerade fest, dass man als Tag-Namen natürlich hätte "File" bzw. "Directory" nehmen müssen. Dafür kann man dann das Type-Attribut weglassen. Naja es war schon spät 8)
Leonidas
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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Leonidas hat geschrieben:und ich denke ich hätte die Konstanten aus der Klasse rausgezogen.
Weil? Meinst du nach `__init__` verschieben oder komplett aus der Klasse raus?
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.
Was ist ein Generator?
Leonidas hat geschrieben:Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit.
`os.walk()` macht eigentlich genau dasselbe.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

droptix hat geschrieben:Weil? Meinst du nach `__init__` verschieben oder komplett aus der Klasse raus?
Ich würde es aus der Klasse rausholen.
droptix hat geschrieben:
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.
Was ist ein Generator?
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:
Leonidas hat geschrieben:Andererseits könnte das durch die Rekursion problematisch werden, denn Python hat ein Rekursionslimit.
`os.walk()` macht eigentlich genau dasselbe.
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.
Ich kann mich aber auch irren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten