Ich bin Python-Neuling und lese nach einer langen Pause gerade das zweite Lehrbuch. Neben der vielen Theorie wird immer geraten, sich an eigenen kleinen Projekten zu versuchen, ganz nach dem Motto "Wer kein Ziel hat, kann auch nicht ankommen".
Gestern habe ich also angefangen, mir ein Skript zu überlegen, dass Bilder in einem Startverzeichnis sucht und anschließend in einem neuen Verzeichnis, allerdings mit der gleichen Unterstruktur abspeichert.
Ich habe schon intensiv gegoogelt und u.a. auf Stackoverflow einen Tipp gefunden. Trotzdem wirf mir mein Programm einen Fehler aus, den ich nicht verstehe.
Wenn ihr mir helft, wäre das super. Bitte belasst die Struktur des Programms aber so wie sie ist. Vielleicht ist es nicht optimal oder es gibt eine einzelne Funktion für das, wo ich mir einen längeren Algorithmus überlegt habe - ich will jedoch daran lernen und das Wichtigste für mich ist:
Wie kann eine Funktion auf Variablen einer anderen zugreifen? Gefunden habe ich die Tipps: Beim Aufruf übergeben (also als Parameter), die Variable global machen oder als ein Attribut der Funktion festlegen. Beim Aufruf übergeben ist zwar ne schöne Sache, was aber, wenn ich mal eine Variable aus einer anderen Funktion brauche, die die aktuelle gerade nicht aufruft? Global gefällt mir nicht so, da es angeblich unsicher ist und darüber hinaus blöd, wenn ich das Skript mal als Modul benutzen will.
Code: Alles auswählen
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Für die Filesystem-Aufgaben ist das Modul "os" nötig. Hier wird es importiert.
import os
# Um das Verzeichnis netter auswählen zu können benutze ich tkFileDilaog und importiere es daher auch.
import tkFileDialog
def main():
# Der Startpfad muss vorhanden sein, daher die Option mustexist=1, beim Zielpfad ist es egal.
main.startpath = tkFileDialog.askdirectory(mustexist=1)
main.targetpath = tkFileDialog.askdirectory()
crawler(main.startpath)
#Der Crawler geht die Verzeichnisse rekursiv durch und beauftragt den Converter mit den Bildern.
def crawler(startpath):
crawler.dislist = list(startpath)
for name in crawler.dirlist:
listentries = os.listdir(os.curdir)
for entry in listentries:
if os.path.isdir(os.path.join(os.curdir, entry)):
crawler.dirlist.append(os.path.join(os.curdir, entry))
elif ".JPG" in entry or ".jpg" in entry or ".jpeg" in entry:
converter(os.path.join(os.curdir, entry))
def converter(imagefile):
prefix, subpath = imagefile.split(main.startpath, 1)
subpath.replace(" ", "\ ")
command = "convert " + str(imagefile) + " -resize 25%" + str(main.targetpath) + str(subpath)
if __name__ == "__main__":
main()
Wäre super, wenn mir jemand weiterhelfen kann. Mir geht es nicht nur um das Skript, sondern auch darum, wie ich Funktionen in Python effektiv miteinander kommunizieren lassen kann.
lg,
Jaguan
Edit: Typo