Fotos von Kamera laden und sortieren

Du hast eine Idee für ein Projekt?
iScream
User
Beiträge: 11
Registriert: Samstag 25. Juli 2009, 11:15

Hi!
Ich bin ein absoluter Python-Newbie, habe bisher 2 Tutorials gelesen. Am Ende stand immer etwas wie "Um mehr zu lernen, einfach drauflos programmieren". Diese Methode hat mir schon geholfen, mich in Linux einzufinden, daher erhoffe ich mir auch hier Erfolg.

Ich möchte ein Skript schreiben, dass Fotos von einer Kamera lädt, wie dem Titel zu entnehmen ist. Ich habe zu diesem Skript noch keine Zeile Code geschrieben, ich habe zunächst nur analysiert, was ich tun könnte. An einigen Stellen hapert es, daher erhoffe ich mir Hilfe von euch :wink:

Ich habe erstmal folgende grundlegende Vorstellung:
Das Skript soll die Kamera erkennen, und alle Bilder in meinen Bilderordner sichern. Dabei sollen die Bilder in Unterordner je nach Aufnahmedatum (z.B. "2009_04_30"). Irgendwie sollen nun die übertragenen Bilder gekennzeichnet oder indexiert werden, damit beim nächsten mal nur neue Fotos übertragen werden.

Erkennen und Übertragen

Nun eine Frage zum effizientesten Programmierstil. Ich kann mir 2 Möglichkeiten zum einsortieren vorstellen, welche ist wohl besser?
  • 1.Idee: Bilder von os.system listen lassen und in ein Dictionary eintragen lassen. Dann jedem Bild das Aufnahmedatum im Dictionary zuordnen. Anschließend eine Liste mit Hilfe einer Schleife anlegen, die die nötigen Befehle zum Erstellen der Ordner und kopieren der Bilder hat.

    2.Idee: Bilder nacheinander erkennen lassen und direkt einordnen, Ordner mit Hilfe einer if/else-Abfrage erstellen lassen.
An dieser Stelle stellt sich mir auch eine andere Frage: Wie kann ich das Aufnahmedatum auslesen lassen?



Kennzeichnen/Indexieren

Meine erste Idee war, an übertragene Bilder einfach ein Präfix anhängen zu lassen, doch ich weiß nicht, was meine Kamera davon hält. :lol:
Besser wäre da vielleicht eine Indexierung, wobei diese bei ca. 4000 Bildern im Jahr schnell große Ausmaße annehmen könnte.
Oder wäre es einem Skript sogar zuzumuten, den eigenen Bilderordner auf bereits vorhandene Bilder zu überprüfen?



Ich würde mich sehr freuen, wenn mir jemand hilft. :)
Ich weiß, nicht das einfachste für einen Anfänger, aber ich halte viel von "Lerning by Doing" und hoffe mit Hilfe gut durchzukommen.

Falls ich an irgendeiner Stelle völlig quer denke, unmögliche Sachen erwarte oder es einen deutlich besseren Weg gibt, dann schreibt es einfach. Ich habe kein Problem mit Umgestaltung und kann Kritik gut vertragen ;)


---------------------------
liebe Grüße,
iScream
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

1.Idee: Bilder von os.system listen lassen und in ein Dictionary eintragen lassen. Dann jedem Bild das Aufnahmedatum im Dictionary zuordnen. Anschließend eine Liste mit Hilfe einer Schleife anlegen, die die nötigen Befehle zum Erstellen der Ordner und kopieren der Bilder hat.
Keine Ahnung wie du dir das vorstellst. Da hört sich das 2. vernünftiger an.
Einfach das Aufnahmedatum auslesen und falls nötig einen Unterordner erstellen. Wie du das Aufnahmedatum auslesen kannst weiß ich nicht, aber da kann dir sicher jemand anders (oder Google) weiterhelfen, dürfte ganz simpel sein.

Also wie ich's machen würde:
Eine Schleife, die alle Bilder auf der Kamera durchgeht (for + os.listdir) und dann ganz simpel anhand des Aufnahmedatums das jeweilige Bild in dem entsprechenden Unterordner einordnen.
Dabei natürlich eine if Abfrage, ob das Bild schon vorhanden ist oder ob der Ordner noch erstellt werden muss.
Eigentlich recht simpel, programmier einfach drauf los und mach dir nicht so viele Gedanken ;)
Wenn du dann mal irgendwo nicht weiterkommst hilft dir hier sicherlich jeder gerne weiter. Sofern du auch Eigeninitiative zeigst.

Edit: Und 4000 Bilder kannst du deinem Programm ruhig zumuten.
Edit2: Und ich würde demnächst eher in "Allgemeine Fragen" fragen, da du dort wohl am meisten Beachtung finden wirst.
iScream
User
Beiträge: 11
Registriert: Samstag 25. Juli 2009, 11:15

@Karl: Danke für die Antwort :) Ich habe gerade Besuch, daher werde ich erst später das ausprobieren können. Vielen Dank für den Tipp mit "os.listdir" Kenne ich noch nicht, werde ich aber drüber nachlesen ;)
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Erstmal freut es mich zu lesen, dass jemand so was plant.
Ich hatte mir vor kurzer Zeit mit ähnlichem beschäftigt. Allerdings bin ich jetzt voll und ganz mit einem anderen Projekt beschäftigt.

Karl hat geschrieben:Wie du das Aufnahmedatum auslesen kannst weiß ich nicht, aber da kann dir sicher jemand anders (oder Google) weiterhelfen, dürfte ganz simpel sein.
Dazu gibt es mehrere Module.
z.B. mutagen (allerdings eher für MP3s)
jpeg ist auch noch ein Modul von dem ich gelesen hat (funktioniert bei mir aber nicht) (Bsp. wie es gehen sollte: http://snippets.dzone.com/posts/show/1021 )

Soweit erstmal von mir, aber ich werde mich mit Sicherheit noch einmal in diesem Thread zu Wort melden :wink:

Viel Glück usw ;)
Pascal
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Vllt kann das ja helfen:

Code: Alles auswählen

import shutil
import os
import datetime


START=
ZIEL=

os.chdir(START)

bilder=[]
for dat in os.listdir(os.getcwd()):
     if dat.endswith('.jpg') or dat.endswith('.JPG'):
          bilder.append(dat)



     


#ordner erstellen und kopieren

for bild in bilder:
     aufnahme=str(datetime.date.fromtimestamp(os.path.getatime(bild)))
     os.chdir(ZIEL)
     if not os.path.isdir(aufnahme):
          os.mkdir(aufnahme)

     os.chdir(START)
     shutil.copy(bild, os.path.join(ZIEL, aufnahme))
     os.remove(bild)
     print bild, 'wurde nach ', aufnahme, 'verschoben'


print 'Vorgang abgeschlossen'

     
Das hat wunderbar funktioniert. (START und ZIEL muss du halt selbst angeben)

Allerdings wird das Datum gewählt, an dem irgendwas zuletzt an dem Bild geändert wurde.
iScream
User
Beiträge: 11
Registriert: Samstag 25. Juli 2009, 11:15

Hey Pascal :) Danke für Antwort und Code. Da ich noch anfänger bin, würde ich gerne den Code Schritt-für-Schritt durchgehen, um ihn zu verstehen, ich möchte ja etwas bei lernen. Wenn ich was falsch verstehe, einfach korrigieren ;)

Code: Alles auswählen

import shutil
import os
import datetime
Du importierst also zunächst shutil (ein Modul für Dateioperationen), os (das Modul für Systemoperationen) und datetime (ein Modul zur Zeitrechnung?)

Code: Alles auswählen

START=
ZIEL=

os.chdir(START)
Du setzt Variablen für Quell- und Zielpfad. Anschließend änderst du das Arbeitsverzeichnis.

Code: Alles auswählen

bilder=[]
for dat in os.listdir(os.getcwd()):
     if dat.endswith('.jpg') or dat.endswith('.JPG'):
          bilder.append(dat)
Eine leere Liste wird erstellt. Sämtliche Dateien die auf "jpg" oder "JPG" enden werden der Liste hinzugefügt.

Code: Alles auswählen

for bild in bilder:
     aufnahme=str(datetime.date.fromtimestamp(os.path.getatime(bild)))
     os.chdir(ZIEL)
     if not os.path.isdir(aufnahme):
          os.mkdir(aufnahme)
Mit einer Schleife werden die Ordner erstellt, falls sie noch nicht vorhanden sind.

Code: Alles auswählen

     os.chdir(START)
     shutil.copy(bild, os.path.join(ZIEL, aufnahme))
     os.remove(bild)
     print bild, 'wurde nach ', aufnahme, 'verschoben'


print 'Vorgang abgeschlossen'
Anschließend kopierst du das Bild und löschtst die Quelldatei. Das würde ich bei mir auslassen, denn ich möchte noch Bilder von der Kamera zeigen ;)




Ich werde morgen mal im wachen Zustand nochmal Ideen ausarbeiten. Ich finde es echt toll, dass du dich damit befasst hast und auch schon diesen Code entwickelt hast :) Auf die Module wäre ich als Anfänger nie gekommen ;) Ich habe noch ein paar Verbesserungsvorschläge, die ich mal posten werde. Bitte nimm mir das nicht übel. Das kommt immer blöd wenn man erstmal einen funktionierenden Code hat und andere meckern dann daran^^ Ich hoffe du vestehst, ich will nur lernen und optimieren. Vielen Dank und lg,
iScream
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

iScream hat geschrieben:

Code: Alles auswählen

START=
ZIEL=

os.chdir(START)
Du setzt Variablen für Quell- und Zielpfad. Anschließend änderst du das Arbeitsverzeichnis.
Nein. Erst kommt ein SyntaxError und danach beendet sich der Interpreter.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

1. Lob an Dich, dafür das den Code noch einmal so sorgfältig durchgenommen hast.
2.
iScream hat geschrieben:Ich habe noch ein paar Verbesserungsvorschläge, die ich mal posten werde. Bitte nimm mir das nicht übel. Das kommt immer blöd wenn man erstmal einen funktionierenden Code hat und andere meckern dann daran^^ Ich hoffe du vestehst, ich will nur lernen und optimieren.
Nein, ich nehme es Dir nicht übel.
Ganz im Gegenteil.

3. Bei dem Programm gibt es allerdings ein Problem:
os.path.getmtime, getatime und getctime liefern alle nicht wirklich dass, was ich/du/wir suche/suchst/suchen.
So viel dazu:http://docs.python.org/library/os.path. ... h.getatime


4. Ein bisschen Komfort für die Wahl der Pfade:

Code: Alles auswählen

from tkFileDialog import askdirectory
def zielwaehlen():
    speicherziel=askdirectory()
    return speicherziel

zielwaehlen()
So viel erstmal für heute

Pascal
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Leonidas hat geschrieben:
iScream hat geschrieben:

Code: Alles auswählen

START=
ZIEL=

os.chdir(START)
Du setzt Variablen für Quell- und Zielpfad. Anschließend änderst du das Arbeitsverzeichnis.
Nein. Erst kommt ein SyntaxError und danach beendet sich der Interpreter.
Ich wollt ja nicht alles vorgeben.
Natürlich muss man dort noch den Pfad eintragen.

Bei mir sieht das ja auch so aus:

Code: Alles auswählen

ZIEL='C:\Users\Pascal\Pictures\FOTOS'
START='C:\Users\Pascal\Desktop\Handy-Speicherkarte\\bilder'
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest Raw-Strings verwenden, dann ist es auch nicht verwirrend warum da einmal ein Doppelbackslash ist und woanders nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

from tkFileDialog import askdirectory
def zielwaehlen():
    speicherziel = askdirectory()
    return speicherziel

Code: Alles auswählen

from tkFileDialog import askdirectory
def zielwaehlen():
    return askdirectory()

Code: Alles auswählen

from tkFileDialog import askdirectory
zielwaehlen = askdirectory

Code: Alles auswählen

from tkFileDialog import askdirectory as zielwaehlen

Code: Alles auswählen

from tkFileDialog import askdirectory as ziel_waehlen

Code: Alles auswählen

from tkFileDialog import askdirectory
Das Leben ist wie ein Tennisball.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Zum Foto's sortieren, habe ich mir ein kleines tool geschrieben, sourcen sind hier: http://code.google.com/p/python-code-sn ... s/EXIFTool
Ist nicht perfekt, tut's aber für mich ;)

Man könnte als Quelle die Kamera Flash Karte angeben und "move" aktivieren. Dann werden die Bilder von den Kamera auf Platte verschoben und in Verzeichnisse gepackt, das dem Schema: /jahr/monat/tag/

Um das Aufnahme Datum zu bekommen, nutzte ich per subprocess das Perl tool "exiftool". Mittlerweile findet sich bestimmt auch eine passendes Python Modul dazu.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

EyDu hat geschrieben:

Code: Alles auswählen

from tkFileDialog import askdirectory
def zielwaehlen():
    return askdirectory()
So war es eigentlich gedacht.
EyDu hat geschrieben:

Code: Alles auswählen

from tkFileDialog import askdirectory as zielwaehlen
Darauf wär ich ehrlich gesagt nicht gekommen. Ist aber durchaus logisch.

Wobei dann allerdings

Code: Alles auswählen

from tkFileDialog import askdirectory
bevorzugen würde.

Aber um kurz vor Mitternacht ist das ja auch kein Wunder :roll: :wink:

Allerdings ist *return speicherziel* beim ersten durchlesen besser zu verstehen als *askdirectory*
Wobei hier gleich wieder die Diskussion mit dem Englisch losgeht. :roll:

Und Analog zu *zielwaehlen()* kann man ja auch noch eine Funktion *startwaehlen()* schreiben ;) :roll:
BlackJack

@Pascal: Da würde ich aber mal eine Diskussion über "Deutsch" lostreten wollen. Das Wort "start" passt hier nicht, denn da "startet" ja nichts, sondern das ist die *Quelle*.
iScream
User
Beiträge: 11
Registriert: Samstag 25. Juli 2009, 11:15

Vielen Dank für eure Antworten :) Ich habe jetzt den Code mal getestet und bissel verbessert. Habe die Namen angepasst und 2 Funktionen geschrieben. Habe mich auch an das Englisch gehalten :lol:

Hier ist der Code:

Code: Alles auswählen

import shutil
import os
import datetime
from tkFileDialog import askdirectory

#Quelle waehlen und als "source" speichern
def choosesource():
    global source    
    source = askdirectory()
#Ziel waehlen und als "destination" speichern
def choosedestination():
    global destination    
    destination = askdirectory()
#Startet die Abfragen beim Aufruf
if __name__ == '__main__':
    choosesource()
    choosedestination()    

os.chdir(source)
bilder = []
for dat in os.listdir(os.getcwd()):
     if dat.endswith('.jpg') or dat.endswith('.JPG'):
          bilder.append(dat)


#ordner erstellen und kopieren
for bild in bilder:
     aufnahme = str(datetime.date.fromtimestamp(os.path.getatime(bild)))
     os.chdir(destination)
     if not os.path.isdir(aufnahme):
          os.mkdir(aufnahme)

     os.chdir(source)
     shutil.copy(bild, os.path.join(destination, aufnahme))
     os.remove(bild)
     print bild, 'wurde nach ', aufnahme, 'kopiert'
#Faktisch wurde ja kopiert und nicht verschoben, daher den Text geändert


print 'Vorgang abgeschlossen'

Hat bei mir unter Ubuntu 9.04 gut funktioniert. Bin jederzeit offen für Verbesserungsvorschläge. Wobei ich zu meiner Schande gestehen muss, dass ich EyDus Post nicht ganz verstanden habe :oops:
BlackJack

@iScream: Vergiss dass es ``global`` gibt und arbeite das Tutorial in der Dokumentation durch.

Die Abfrage von `__name__` kommt für gewöhnlich ganz ans Ende und der ganze Quelltext auf Modulebene sollte in einer Funktion verschwinden. *So* bringt das überhaupt nichts, sondern dient zusammen mit den beiden "Funktionen" und dem ``global`` nur der Verwirrung des Lesers.

`os.chdir()` sollte man IMHO auch gleich wieder vergessen. Das Arbeitsverzeichnis zu ändern ist keine gute Idee, weil man da schnell Probleme bekommt, wenn man das an mehr als einer Stelle machen wollte. Dann weiss man nie so recht wo man gerade ist.

Statt der ersten Schleife könnte man das `glob`-Modul mal anschauen.

Das Du den Text von "verschoben" nach "kopiert" verändert hast ist Blödsinn. Egal was faktisch passiert -- es ist am Ausgangsort hinterher nicht mehr da, dass ist also nicht das was man erwarten würde, wenn das Programm nur meldet, dass kopiert wurde.

Es werden keine Fehler behandelt und der Test vor dem Anlegen eines Verzeichnisses ist überflüssig. Da sollte man einfach versuchen das Verzeichnis anzulegen und eventuelle Fehler dabei ordentlich behandeln. Es können da so nämlich mindestens zwei Dinge passieren: 1. Der Test sagt alles ist okay, und kurz bevor das Verzeichnis angelegt werden soll, macht das ein anderer Prozess, oder 2. es gibt kein Verzeichnis mit dem Namen, aber eine *Datei*. In beiden Fällen haut's Dir eine Ausnahme um die Ohren.
iScream
User
Beiträge: 11
Registriert: Samstag 25. Juli 2009, 11:15

Die Abfrage von `__name__` kommt für gewöhnlich ganz ans Ende und der ganze Quelltext auf Modulebene sollte in einer Funktion verschwinden. *So* bringt das überhaupt nichts, sondern dient zusammen mit den beiden "Funktionen" und dem ``global`` nur der Verwirrung des Lesers.
Habe das verschwinden lassen ;) Als ich was anderes hier gepostet hatte, war die erste Änderung durch einen anderen dieses "if __name__ ==..." daher ging ich davon aus, damit spart man sich genauso Kritik wie mit konsequentem Englisch. Jetzt kann das "global" doch bleiben, oder? Ich weiß nämlich sonst nicht, wie ich den Wert der Funktion in eine Variable außerhalb verpackt kriege.
`os.chdir()` sollte man IMHO auch gleich wieder vergessen. Das Arbeitsverzeichnis zu ändern ist keine gute Idee, weil man da schnell Probleme bekommt, wenn man das an mehr als einer Stelle machen wollte. Dann weiss man nie so recht wo man gerade ist.
Wie sollte ich es wohl vermeiden? Zurzeit sehe ich keinen anderen Weg, an die Bilder zu gelangen :?: (Bitte Vorschlag)
Statt der ersten Schleife könnte man das `glob`-Modul mal anschauen.
Werde ich mir anschauen. Kenne aber bisher kaum Module, daher helfe ich mir mit "Bordmitteln" (obwohl Module in gewissermaßen auch "Bordmittel" sind)
Das Du den Text von "verschoben" nach "kopiert" verändert hast ist Blödsinn. Egal was faktisch passiert -- es ist am Ausgangsort hinterher nicht mehr da, dass ist also nicht das was man erwarten würde, wenn das Programm nur meldet, dass kopiert wurde.
:lol: Dickes Sorry! Ich hatte den funktionierenden Code noch "verschönert" vor dem posten. Daher war das Löschen nicht auskommentiert - jetzt aber
Es werden keine Fehler behandelt und der Test vor dem Anlegen eines Verzeichnisses ist überflüssig. Da sollte man einfach versuchen das Verzeichnis anzulegen und eventuelle Fehler dabei ordentlich behandeln. Es können da so nämlich mindestens zwei Dinge passieren: 1. Der Test sagt alles ist okay, und kurz bevor das Verzeichnis angelegt werden soll, macht das ein anderer Prozess, oder 2. es gibt kein Verzeichnis mit dem Namen, aber eine *Datei*. In beiden Fällen haut's Dir eine Ausnahme um die Ohren.
Habe nun ein "try...except" eingebaut. Ich hoffe das ist so OK ;)


Vielen Dank, dass du dir die Zeit genommen hast, ich lerne hierdurch ne ganze Menge :wink:

Ich habe noch eine Änderung des Ordnernamens vollzogen: Aus 2009-08-12 wird 2009_08_12. Das habe ich gemacht, da die Ordner nahtlos zu den anderen Ordnern passen sollen, die ich habe. Des Weiteren ist nun noch eine Variable Englisch.

Der neue Code:

Code: Alles auswählen

import shutil
import os
import datetime
from tkFileDialog import askdirectory

#Quelle waehlen und als "source" speichern
def choosesource():
    global source    
    source = askdirectory()
#Ziel waehlen und als "destination" speichern
def choosedestination():
    global destination    
    destination = askdirectory()
#Startet die Abfragen beim Aufruf
choosesource()
choosedestination()    

os.chdir(source)
bilder = []
for dat in os.listdir(os.getcwd()):
     if dat.endswith('.jpg') or dat.endswith('.JPG'):
          bilder.append(dat)


#ordner erstellen und kopieren
for bild in bilder:
     cap = str(datetime.date.fromtimestamp(os.path.getatime(bild)))
     capturedate = cap[0:4] + '_' + cap[5:7] + '_' + cap[8:10]
     os.chdir(destination)
     try:
        os.mkdir(capturedate)
     except:
        pass
     os.chdir(source)
     shutil.copy(bild, os.path.join(destination, capturedate))
#     os.remove(bild)
     print bild, 'wurde nach ', capturedate, 'kopiert'
#Jetzt wurde kopiert :P 'os.remove' erstmal als Kommentar behalten, falls ich mir es anders ueberlege


print 'Vorgang abgeschlossen'
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Jetzt kann das "global" doch bleiben, oder? Ich weiß nämlich sonst nicht, wie ich den Wert der Funktion in eine Variable außerhalb verpackt kriege.
so?

Code: Alles auswählen

def choosesource():
    return askdirectory()
source=choosesource()
for file in os.listdir(source): pass
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

Wenn du die '-' lieber mit '_' ersetzen willst, benutze cap.replace('-', '_')

@ BlackJack
Was ist an os.chdir() so schlimm?
iScream hat geschrieben:

Code: Alles auswählen

from tkFileDialog import askdirectory

#Quelle waehlen und als "source" speichern
def choosesource():
    global source    
    source = askdirectory()
#Ziel waehlen und als "destination" speichern
def choosedestination():
    global destination    
    destination = askdirectory()
#Startet die Abfragen beim Aufruf

Meiner Meinung nach .... schwachsinn.. :roll:

Die Funktionen machen beide das gleiche!
ein "return" wäre da sinnvoller.

Und da "asdirectory()" auch nichts anderes mach als den Pfad zurückzuliefern, kann man gleich schreiben

print 'Start wählen'
START=asdirectory()
print 'Ziel wählen'
ZIEL=askdirectory()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Pascal hat geschrieben:Und da "asdirectory()" auch nichts anderes mach als den Pfad zurückzuliefern, kann man gleich schreiben

print 'Start wählen'
START=asdirectory()
print 'Ziel wählen'
ZIEL=askdirectory()
Neu gelerntes sofort umgesetzt :-) Du solltest aber noch einen Blick in PEP8 werfen.

Zum chdir: Damit wechselst du das Arbeitsverzeichnis. Normalerweise sollte man/ein Außenstehender davon ausgehen können, dass das Arbeitsverzeichnis gleich bleibt und sich dort befindet, wo man es angegeben hat/das Script gestartet hat. Außerdem arbeitet man beim Wechsel des Verzeichnis auf globalen Variablen. Rufst du verschachtelte Funktionen auf, die alle was auf Verzeichnissen machen und alle irgendwie wechseln, dann baust du dir mit Sicherheit einen Fehler ein.

@iScream: der Code ist ja noch schlimmer geworden :shock:

Das "if __name__ ..." sollte nicht verschwinden sondern ganz ans Ende des Codes. Was verschwinden soll ist der Code auf Modulebene. Das bedeutet bei dir konkret: Teile dein Programm in sinnvolle Funktionen auf.

"global" ist niemals eine Lösung. Verwende es einfach nicht. Wenn du es einsetzt, dann machst du etwas falsch. Die Lösung dieses Problems sind Rückgabewerte und Parameter. Es gilt: eine Funktion sollte keine Seiteneffekte haben, natürlich abgesehen von IO und Konsorten. Maximal sollten sich die Parameter verändern.

Dein try-except fängt ALLE Fehler ab, dass kann manchmal zu seltsamen Fehlern führen, die nicht nachvollziehbar sind. Gebe also immer die Fehler an, die abgefangen werden sollen. Eine Fehlerbehandlung mit einem "pass" ist in den Meisten fällen auch Unfug - so wie bei dir. Es kann nämlich durchaus passieren, dass das Verzeichnis nicht erstellt werden konnte. Dann läuft dein Programm weiter, liefert dann aber sicher in Zeile 35 einen Fehler.
Das Leben ist wie ein Tennisball.
Antworten