[gelöst] Bessere Lösung für weiterlaufenden Zähler?

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
Wirklich? Ich dachte es gibt die Namen in Dateisystem Ordnung zurück.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

Code: Alles auswählen

>>> print os.listdir.__doc__
listdir(path) -> list_of_strings
... The list is in arbitrary order ...
Frage beantwortet? :D
BlackJack

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. :-)
BlackJack

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 :-o .
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. :-)

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
Betr. `os.path.join()`:
BlackJack hat geschrieben:Das hat auch in dem Thread nichts zur Lösung des Problems beigetragen, da war es genauso überflüssig.
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.
Wieso musst Du Anführungstriche in die Zeichenkette hineinbekommen? Das da welche drin waren, war doch gerade das *Problem* in dem anderen Thread!
Da war ich für os.path.join() ganz dankbar, auch wenn ich es faktisch als "os.filename.join" mißbrauche...
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.
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

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!
Ohne ging es aber auch nicht...
BlackJack hat geschrieben:
Da war ich für os.path.join() ganz dankbar, auch wenn ich es faktisch als "os.filename.join" mißbrauche...
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.
Erm... Ich brauche os.path.join(), um drei Namensteile miteinander zu verbinden:
- "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.
BlackJack hat geschrieben:Ein weiterer Vorteil von Kapselung in Funktionen und Klassen ist auch, dass man die Teile einzeln testen kann bis sie funktionieren.
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?
(Ich teste derzeit noch immer durch das Einfuegen von "print"-Befehlen... :-o )

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").
BlackJack

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:

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'
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.
merlin_emrys
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'
>>> 
Geht doch :-) . Da ich "vorname" und die laufende Nummer eh in dieser Weise "referenziere", bleibt nur die Zeile mit der Dateierweiterung, die ich mir sparen koennte... und der Zugriff auf das Modul os, natuerlich.
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.
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... :-o )
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Nur das 'join()' an dieser Stelle nichts tut...

Code: Alles auswählen

>>> vorname = "muster"
>>> nummer = str(42)
>>> extension = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
>>> vorname + nummer + extension
'muster42.bmp'
Übrigens wage ich deine Ausgabe zu bezweifeln, 'Dateierweiterung' etwas zuweisen und dann 'extension' benutzen geht schief ;)
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Nirven hat geschrieben: Übrigens wage ich deine Ausgabe zu bezweifeln, 'Dateierweiterung' etwas zuweisen und dann 'extension' benutzen geht schief ;)
Jetzt bin ich abgehaengt... was meinst Du damit? *voellig verwirrt*
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

merlin_emrys hat geschrieben:>>> vorname = "muster"
>>> nummer = str(42)
>>> Dateierweiterung = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
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 anfangen ;)
merlin_emrys
User
Beiträge: 110
Registriert: Freitag 3. März 2006, 09:47

Nirven hat geschrieben:
merlin_emrys hat geschrieben:>>> vorname = "muster"
>>> nummer = str(42)
>>> Dateierweiterung = ".bmp"
>>> os.path.join(vorname + nummer + extension)
'muster42.bmp'
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 anfangen ;)
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... :oops:
Antworten