TypeError beim Dateipfad einlesen

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.
Antworten
Nikero
User
Beiträge: 6
Registriert: Samstag 12. April 2014, 15:52

Hallo.
Zunächst zu dem Problem. Ich erhalte beim ausführen meines Programmes folgende Fehlermeldung:
TypeError: must be encoded string without null bytes not str
Nun zu den Umständen. Ich programmiere gerade eine Routine, mit der man ein spezielles Dateiformat auslesen kann. Die ausgelesenen Messdaten werden dann durch andere Methoden grafisch dargestellt.
Die Dateiauswahl erfolgt über eine grafische Oberfläche, bei dem man den Ordner mit den Dateien auswählt. Alle in dem Ordner befindlichen Dateien werden dann verarbeitet. Bei einigen Testdateien hat dies auch super funktioniert. Jetzt habe ich neue Testdateien bekommen, die ähnlich heißen, bei denen aber der genannte Fehler auftritt.
Ich habe den Fehler gegooglt und einige Themen gefunden, in denen es hieß, der Fehler würde daher kommen, dass in der Pfadeingabe beispielsweise "\n" oder ähnliches vorkommen würde. Aber auch ganz naiv umbenennen der Dateien und des Ordners hilft nicht.
Daher bin ich ziemlich ratlos, wie ich das Problem angehen soll. Den String als "raw" zu deklarieren soll helfen, was ich bei der Einleseart ja nicht zu bewerkstelligen ist, oder?
BlackJack

@Nikero: Wichtig wäre zu wissen wobei exakt diese Ausnahme auftritt. Ohne Code und Werte kann man da nicht viel sagen.
Nikero
User
Beiträge: 6
Registriert: Samstag 12. April 2014, 15:52

Der betreffende Codeabschnitt ist folgender:

Code: Alles auswählen

picture_file_name = AFMdata.channel[-1].replace(" ","_") + "_" + file_name

jpeg_image_path = (AFMdir.thumbnail_directory + "/" + picture_file_name + ".jpeg")

if os.path.isfile(jpeg_image_path):
    return
Dabei kommt folgender Fehler:
File "AFM_thumbs/RHK.py", line 392, in PrepareRHKimage
if os.path.isfile(jpeg_image_path):
File "/usr/lib/python2.7/genericpath.py", line 29, in isfile
st = os.stat(path)
TypeError: must be encoded string without NULL bytes, not str
Beim näherem untersuchen des Fehlers fand ich heraus, dass es nicht am Dateipfad oder dem Dateinnamen lag, sondern dass im ausgelesenen Channelnamen Sonderzeichen sind. Ich war da wohl leider etwas vorschnell.

Jetzt stehe ich aber vor einem anderen Problem, da ich nun die Sonderzeichen im Channelnamen wegbekommen muss, wenn sie vorhanden sind. Ich versuche daher gerade mit regex-Ausdrücken zu arbeiten, was aber irgendwie nicht funktioniert. Der mit print ausgegebene Channelname hat dabei zwei Dreiecke als letzte Zeichen. Die versuche ich folgendermaßen mit regex zu finden:

Code: Alles auswählen

if re.match('^[a-zA-Z0-9\s]*$', channel_name):
    channel_name_index = re.search('^[a-zA-Z0-9\s]*$', channel_name)
    AFMdata.channel.append(channel_name[:channel_name_index] + AFMdata.scandir[-1])
Die Dreiecke werden damit aber nicht erkannt. Da ich eine Bytecode Datei auslese, kann es sein, dass die daher kommen. Hat jemand eine Idee, was man da machen könnte?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

wenn Du alle Sonderzeichen einfach löschen willst solltest Du es wohl eher so probieren:

Code: Alles auswählen

picture_file_name = re.sub('\W', ,'_', AFMdata.channel[-1]) + "_" + file_name
Nikero
User
Beiträge: 6
Registriert: Samstag 12. April 2014, 15:52

Sirius3 hat geschrieben:wenn Du alle Sonderzeichen einfach löschen willst solltest Du es wohl eher so probieren:

Code: Alles auswählen

picture_file_name = re.sub('\W', ,'_', AFMdata.channel[-1]) + "_" + file_name
Danke für die Antwort, sie hat mir sehr weitergeholfen! Jetzt hat sich bei mir aber noch eine letzte Anfängerfrage zu regex Ausdrücken ergeben: Kann man bei Regex Ausdrücken Ausnahmen angeben? Also sowas wie '\W' ohne '\s'? Die offizielle Dokumentation der Python regex Syntax hat mir da irgendwie nicht weitergeholfen.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann definiere es halt als nicht (\w oder \s):

Code: Alles auswählen

picture_file_name = re.sub(r'[^\w\s]', ,'_', AFMdata.channel[-1]) + "_" + file_name
Nikero
User
Beiträge: 6
Registriert: Samstag 12. April 2014, 15:52

Sirius3 hat geschrieben:Dann definiere es halt als nicht (\w oder \s):

Code: Alles auswählen

picture_file_name = re.sub(r'[^\w\s]', ,'_', AFMdata.channel[-1]) + "_" + file_name
Abermals vielen Dank dafür
Antworten