[Python] ValueError: embedded null byte

Gollum1 gollum1.smeagol1 a gmail.com
Mer 4 Apr 2018 00:42:04 CEST


Ciao lista,

dopo tanto tempo di inattività, sto ricominciando a prendere in mano
python, python 3.6.5 per la precisione e su debian unstable.

per riprendere un po' di dimestichezza, prima di riprendere in mano i
progetti che stavo seguendo, soprattutto con genropy (sì, lo so che è
per 2.7, ma io mi preparo anche per il 3.x), volevo rinfrescarmi un
po' la memoria.

sto facendo un programmino abbastanza stupido, che prendendo come
sorgente una directory, ne fa la scansione e tutti i file immagine,
che contengono i dati exif (se non li contengono, baro e gli assegno
una generica "camera sconosciuta", crea nella directory di
destinazione che gli passo una directory con il nome della camera e
poi ci sposta (nelle intenzioni) il file.

quando però vado a fare le seguenti istruzioni, per verificare se
esiste la directory, prima di crearla, quando incontra un particolare
file, mi crasha, con il seguente errore:

Traceback (most recent call last):
  File "./RinominaFoto.py", line 80, in <module>
    scan_dir(args)
  File "./RinominaFoto.py", line 67, in scan_dir
    if not os.path.exists(os.path.join(args['destdir'], camera)):
  File "/usr/lib/python3.6/genericpath.py", line 19, in exists
    os.stat(path)
ValueError: embedded null byte

la riga incriminata è ovviamente:

if not os.path.exists(os.path.join(args['destdir'], camera)):

e presumo che l'errore stia nella varibile camera.

in questo particolare file il valore, subito prima di crashare è il seguente:

camera = "DigitalDigital HH"

e non ci vedo nessun carattere particolare che potrebbe essere nullo e
mandare in crash l'istruzione precedente.

come posso debuggare questo codice?

def scan_dir(args):
    """ Scansiona la directory per ricercare i file da rinominare. """

    from PIL import Image
    import os.path

    for root, dirs, files in os.walk(args['sourcedir']):
        for file in files:
            try:
                exif = Image.open(os.path.join(root, file))._getexif()
                print(os.path.join(root, file))
                camera = get_exif_field(exif, "Make")
                if camera == 0:
                    camera = "Nessuna Camera"
                elif camera is None:
                    camera = "Camera Sconosciuta"
                # else:
                #     camera = camera.upper().split(" ")[0]
                print(camera)
                if not os.path.exists(os.path.join(args['destdir'], camera)):
                    os.makedirs(os.path.join(args['destdir'], camera))

            except OSError:
                continue


ribadisco che per altri file precedenti (con altre camere, quindi o in
assenza di esse) tutto funziona... è proprio questa particolare
stringa, ma in cui non ci vedo nulla di strano che blocca il tutto.

c'é una qualche istruzione che potrebbe ripulire a priori questo
genere di stringhe?


Tnx&Byez
-- 
Gollum1 - http://www.gollumone.it
Tesssssoro, dov'é il mio tessssoro...


Maggiori informazioni sulla lista Python