@Nunslaughter
1)Bedankt voor de link. Erg fijne informatie, vooral omdat ze ook zoveel moeite hebben gestoken in de foute voorbeelden. Ik begrijp alleen nog niet alle logica. Zoals bijvoorbeeld bij het importeren. waarom niet import glob,os,sys,etcetera maar liever alles apart?
2) bedankt voor de tip: 'if iets' dit zit nu in mijn systeem in scheelt een hoop typewerk, evenals natuurlijk if not. Evenals 'While True'.
3) Subprocess was pittig voor me. En heb ik hier nog niet toe kunnen passen. Maar aldoende leert men, zeg maar. Ik heb wel vandaag in een ander bestand subprocess.call() kunnen gebruiken, maar in dit geval met de lange regel 'exiftool blahblah | nogwat | etcetera' was het nog wat lastig.
1) Zet die link maar in uw bladwijzers
. Veel heeft te maken met leesbaarheid, dus alle imports op een nieuwe regel geeft een veel beter overzicht.
Vandaar nog even een opmerking:
try: do_something()
except Exception:
do_error_handling()
Dit is zoiets wat bij grotere projecten best onleesbaar kan worden, zeker bij het doorzoeken van code. Zet beter alles op een nieuwe regel.
Dit is misschien muggenziften, maar beter vroeg geleerd, dan later proberen af te leren
.
3) Subprocess is inderdaad een hele brok, maar wel flink verbeterd tegenover de oudere functies. Waarschijnlijk is het sowieso beter om een Python module te gebruiken voor de exif data in plaats van een extern programma aan te roepen. Even zoeken in het Software Centrum bracht
python-pyexif2 naar boven.
Nog even wat dingetjes:
- De datum splitsen kan misschien makkelijker:
jaar, maand, dag = datum.split(':')
Dan moet er niet meer in de list gezocht worden naar de data. Als er meer data in de datum string zit, gaat ge een ValueError krijgen omdat ge dan teveel data in de 3 variabelen wilt steken, probeer dan het volgende:
jaar, maand, dag, _ = datum.split(':', 3)
Zie volgend stukje als voorbeeld:
>>> s = 'a:b:c:d:e:f'
>>> a, b, c = s.split(':')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
>>> a, b, c, _ = s.split(':', 3)
>>>
- De grote try...except blijft een slecht idee. Laat op zijn minst een goede foutmelding zien, in plaats van gewoon door te gaan. Verander "except: pass" bijvoorbeeld naar:
except Exception as exc:
print "Er liep iets mis bij het verwerken van de data:\n", exc
Hetzelfde eigenlijk bij de try...except bij het corrigeren van de datum. Print de traceback zodat ge tenminste weet wat er fout gelopen is en het script eventueel kunt aanpassen zodat zulke data wel goed behandeld word. Hier wilt ge ook een "continue" in plaats van een "break" zodat hij naar het volgende bestand gaat in plaats van de lus te verbreken.
- Het declareren van de paden kan best in 1 regel:
teldir = os.path.expanduser('~/Pictures - HTC Sensation Z710e/')
# Hetzelfde voor afbeeldingendir
- Het aanmaken van de directories kan ook met:
try:
os.makedirs(afbeeldingendir+jaar+'/'+maand+'/'+dag)
except OSError:
# Deze map bestaat al, gewoon doorgaan dus
pass
Dit zal meteen alle missende onderliggende mappen bijmaken.
En als ge de shutil.move() regel nog even in een try...except zet, kan die grote try...except weg aangezien de rest van de code sowieso geen exception zal gooien.
Zo, hopelijk hebt ge wat aan deze tips
.