Wirklich? Ich dachte es gibt die Namen in Dateisystem Ordnung zurück.BlackJack hat geschrieben:`os.listdir()` liefert die Dateinamen in einer willkürlichen Reihenfolge und nicht sortiert und man müsste bei jeder neuen Datei immer wieder alle Dateinamen durchgehen.
[gelöst] Bessere Lösung für weiterlaufenden Zähler?
-
- User
- Beiträge: 1790
- Registriert: Donnerstag 28. Oktober 2004, 16:33
- Wohnort: Graz, Steiermark - Österreich
- Kontaktdaten:
TUFKAB – the user formerly known as blackbird
Code: Alles auswählen
>>> print os.listdir.__doc__
listdir(path) -> list_of_strings
... The list is in arbitrary order ...
Letztendlich wird es die Dateisystemordnung sein, d.h. die Reihenfolge in der der Dateisystemtreiber die Namen liefert. Bei FAT32 in der Reichenfolge in der die Dateien gespeichert wurden oder wo "Lücken" frei geworden sind, bei ReiserFS werden die Namen durch eine Hash-Funktion gejagt und in einem Sortierbaum gespeichert, also ist die Reihenfolge recht "zufällig", usw.
Also keine Ordnung auf die man sich im Programm verlassen sollte.
Also keine Ordnung auf die man sich im Programm verlassen sollte.
Vorsicht: Skripte die irgendetwas automatisieren und mal so eben schnell geschrieben wurden, haben ab und zu die Angewohnheit sehr lange im Einsatz zu sein und mit der Zeit zu wachsen.merlin_emrys hat geschrieben:Ich werde mal sehen, ob ich mir das "Kapseln" irgendwie angewöhnen kann; den Sinn der Sache sehe ich schon. Nur: Oft bin ich derzeit einfach noch damit zufrieden, wenn meine Programme überhaupt tun, was sie sollen, und Konstruktionen wie "try/except" sind für mich doch sehr schwierig überhaupt zum Laufen zu bringen... Da ist es ungleich leichter und schneller, im "Hauptprogramm" Dinge zur Verfügung zu stellen und sich dann darauf zu verlassen, dass sie auch da sind, wenn ich sie brauche. Und bei 200 Zeilen Quelltext sucht man ja auch nicht so lange... Aber ich gewöhne mich vermutlich trotzdem besser jetzt schon an eine bessere Praxis - immer vorausgesetzt, ich kann sie zum Laufen bringen .
Ein weiterer Vorteil von Kapselung in Funktionen und Klassen ist auch, dass man die Teile einzeln testen kann bis sie funktionieren. Die `next_number()` Funktion:
Code: Alles auswählen
In [23]: import test
In [23]: test.next_number()
Out[23]: 1
In [24]: test.next_number()
Out[24]: 2
In [25]: test.next_number()
Out[25]: 3
In [26]: test.next_number('spam')
Out[26]: 1
In [27]: test.next_number('spam')
Out[27]: 2
In [28]: test.next_number('ham')
Out[28]: 1
In [29]: test.next_number('ham')
Out[29]: 2
In [30]: test.next_number()
Out[30]: 4
In [31]: test.next_number('spam')
Out[31]: 3
Wieso musst Du Anführungstriche in die Zeichenkette hineinbekommen? Das da welche drin waren, war doch gerade das *Problem* in dem anderen Thread!Betr. `os.path.join()`:Rein von der "Symptomatik" her würde ich da widersprechen wollen... Ich habe es noch nicht wieder probiert, aber bisher habe ich keine andere Lösung für das Problem gefunden. Ich bin mir ziemlich sicher, dass ich den Dateinamen irgendwie als String zusammensetzen können muß, ohne daß ich mit den Anführungsstrichen in Teufels Küche komme, aber ich konnte nicht herausfinden, wie. Ich muss sie offenbar irgendwie in den String einbauen, weil ich sie ja nicht in die Klammer hineinschreiben kann - dann wird der Verweis selbst als String interpretiert.BlackJack hat geschrieben:Das hat auch in dem Thread nichts zur Lösung des Problems beigetragen, da war es genauso überflüssig.
Nein das tust Du nicht! Das ginge auch gar nicht weil innerhalb von Dateinamen kein Pfadtrenner vorkommen darf. Du musst mehr geändert haben als nur `os.path.join()` zu benutzen. Und diese *andere* Änderung war die Lösung des Problems. Zeig doch mal Code wo `os.path.join()` nur ein einziges Argument bekommt, der ohne die Funktion nicht mehr funktioniert.Da war ich für os.path.join() ganz dankbar, auch wenn ich es faktisch als "os.filename.join" mißbrauche...
-
- User
- Beiträge: 110
- Registriert: Freitag 3. März 2006, 09:47
Ohne ging es aber auch nicht...BlackJack hat geschrieben:Betr. `os.path.join()`:
Wieso musst Du Anführungstriche in die Zeichenkette hineinbekommen? Das da welche drin waren, war doch gerade das *Problem* in dem anderen Thread!
Erm... Ich brauche os.path.join(), um drei Namensteile miteinander zu verbinden:BlackJack hat geschrieben:Nein das tust Du nicht! Das ginge auch gar nicht weil innerhalb von Dateinamen kein Pfadtrenner vorkommen darf. Du musst mehr geändert haben als nur `os.path.join()` zu benutzen. Und diese *andere* Änderung war die Lösung des Problems. Zeig doch mal Code wo `os.path.join()` nur ein einziges Argument bekommt, der ohne die Funktion nicht mehr funktioniert.Da war ich für os.path.join() ganz dankbar, auch wenn ich es faktisch als "os.filename.join" mißbrauche...
- "Vorname" - der sich aus der Stelle im Programm ergibt, damit ich zuordnen kann, was an Aenderungen ich sehen sollte,
- die laufende Nummer oder einen variablen Input-Teil,
- ".bmp", damit ich die Datei nachher mit Doppelklick oeffnen kann.
Wenn ich nur einen "Fixnamen" habe, nehme ich os.path.join() nicht, weil das auch ohne geht.
Hmm... dann muss man aber die ganzen Variablen "mit Hand" einfuettern, oder? Wenn die Klasse auf ein Bild zugreifen soll, braucht sie ja vermutlich weiterhin eins, um sich testen zu lassen?BlackJack hat geschrieben:Ein weiterer Vorteil von Kapselung in Funktionen und Klassen ist auch, dass man die Teile einzeln testen kann bis sie funktionieren.
(Ich teste derzeit noch immer durch das Einfuegen von "print"-Befehlen... )
Edit:
Eventuell hab ich aber einfach auch nur den Wald vor laute Baeumen nicht gesehen. Ich habe stundenlang (naja, ich glaube, etwas ueber eine Stunde) lang alle Varianten ausprobiert, die mir eingefallen sind, aber es kann sein, dass die ganz schlichte Variante ohne Anfuehrungsstriche aus irgendeinem andern Problem nicht ging und ich das falsch zugeordnet habe. Nachdem ich dann wusste: "Anfuehrungsstriche weglassen funktioniert nicht", habe ich tatsaechlich erst, als ich zu der os.path.join()-Variante gegriffen habe, die Anfuehrungsstriche wieder komplett weggelassen. Und als das ging, habe ich nicht weiter herumgetestet, weil es ohnehin schon eher spaet war und ich noch andere Sachen im Kopf hatte . Aber in einem kleinen Trockentest funktioniert zumindest auf diesem Rechner die reine Additionsvariante jetzt auch, d.h.: Kopie.save(Vorname + VariablerTeil + Dateierweiterung, "BMP").
Nur nochmal zur Demonstration was `os.path.join()` macht und warum man damit Namen, Nummer und Erweiterung nicht zusammenfügen kann, zumindest nicht so wie gewünscht:
Du scheinst ab und zu "programming by accident" zu betreiben. Das ist nicht so gut. Wenn es Probleme gibt, dann probiere die Sachen am besten interaktiv in einer Python-Shell aus.
Code: Alles auswählen
In [7]: os.path.join('muster')
Out[7]: 'muster'
In [8]: os.path.join('muster') + '42' + '.bmp'
Out[8]: 'muster42.bmp'
In [9]: 'muster' + '42' + '.bmp'
Out[9]: 'muster42.bmp'
In [10]: os.path.join('muster', '42', '.bmp')
Out[10]: 'muster/42/.bmp'
-
- User
- Beiträge: 110
- Registriert: Freitag 3. März 2006, 09:47
Code: Alles auswählen
>>> vorname = "muster"
>>> nummer = str(42)
>>> Dateierweiterung = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
>>>
Wenn ich mit Bildern hantiere, die in mehreren Schritten modifiziert werden, scheint mir das teilweise arg umstaendlich. Immerhin muss ich dann jeweils zusehen, dass die Shell die letzte Modifikation mitbekommt... Da ist es fuer mich insgesamt "bequemer", das Programm jeweils durchlaufen zu lassen, zumal ich dann auch gleich mitbekomme, wenn eine Aenderung irgendwo anders Problem bereitet (was bei mir durchaus noch passieren kann - und vermutlich mal wieder ein Hinweis darauf ist, dass ich mich nochmal mit dem Aspekt "Kapselung" beschaeftigen sollte... )Du scheinst ab und zu "programming by accident" zu betreiben. Das ist nicht so gut. Wenn es Probleme gibt, dann probiere die Sachen am besten interaktiv in einer Python-Shell aus.
Nur das 'join()' an dieser Stelle nichts tut...
Übrigens wage ich deine Ausgabe zu bezweifeln, 'Dateierweiterung' etwas zuweisen und dann 'extension' benutzen geht schief
Code: Alles auswählen
>>> vorname = "muster"
>>> nummer = str(42)
>>> extension = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
>>> vorname + nummer + extension
'muster42.bmp'
-
- User
- Beiträge: 110
- Registriert: Freitag 3. März 2006, 09:47
Jetzt bin ich abgehaengt... was meinst Du damit? *voellig verwirrt*Nirven hat geschrieben: Übrigens wage ich deine Ausgabe zu bezweifeln, 'Dateierweiterung' etwas zuweisen und dann 'extension' benutzen geht schief
Der Code, so wie du ihn geschrieben hast, produziert einen Fehler, da 'extension' nicht bekannt ist. Du hast ".bmp' an 'Dateierweiterung' gebunden, benutzt dann aber 'extension' im Aufruf von 'join()', damit kann zumindestens mein Python nichts anfangenmerlin_emrys hat geschrieben:>>> vorname = "muster"
>>> nummer = str(42)
>>> Dateierweiterung = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
-
- User
- Beiträge: 110
- Registriert: Freitag 3. März 2006, 09:47
Ach, da... jetzt hab ich's. Ja, Du hast recht. Kommt davon, wenn ich mit der Shell arbeite. Ich hatte "Dateierweiterung" fuer fruehere Tests auch definiert, und weil Python sich das gemerkt hat, ist es mir nicht aufgefallen... I am terribly sorry...Nirven hat geschrieben:Der Code, so wie du ihn geschrieben hast, produziert einen Fehler, da 'extension' nicht bekannt ist. Du hast ".bmp' an 'Dateierweiterung' gebunden, benutzt dann aber 'extension' im Aufruf von 'join()', damit kann zumindestens mein Python nichts anfangenmerlin_emrys hat geschrieben:>>> vorname = "muster"
>>> nummer = str(42)
>>> Dateierweiterung = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'