Seite 1 von 1

raw string für Variable?

Verfasst: Dienstag 20. April 2021, 17:48
von m.g.o.d
Hi Zusammen,

ich habe folgendes Problem, was ich einfach nicht gelöst bekomme:

Folgender String ist in der Variablen file gespeichert:
file = "K:\Deluxe Music HD\2021-04-20\1618929600000-1618929900000.mp4"

Mein Problem ist nun, dass diese String \202 (u.a.) als unicode interpretiert wird und den Pfad verändert.

Ich hätte keine Probleme, wenn ich einfach ein r".." davor schreiben könnte:
r"K:\Deluxe Music HD\2021-04-20\1618929600000-1618929900000.mp4"

Da ich den String in mehreren Funktionen zusammenbaue, geht das aber so nicht.

Versucht habe ich bereits:
encode/decode('string-escape')
.replace('\', "\\" u.a.)
os.path.join(....)
...

Nichts funktioniert so, wie ich das brauchen würde. Der String soll wie mit r'' ausgewertet werden.
Da ich nach langer Suche bisher nichts gefunden habe, würde ich gerne hier nach einer einfachen Lösung dieses trivialen Problems fragen.

Besten Dank,
m.g.o.d

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 17:59
von __blackjack__
@m.g.o.d: Du kannst einfach ein r davor schreiben. Wenn das nicht geht machst Du irgend etwas anderes falsch. In Code den wir nicht kennen.

Zum zusammensetzen von Pfadteilen verwendet man das `pathlib`-Modul.

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 18:01
von noisefloor
Hallo,

normalerweise sollte das alles kein Problem sein, wenn du konsequent das `pathlib` Modul zum Zusammenbauen benutzt. Da du aber keinen Code zeigst sondern "nur" das nicht funktionierende Ergebnis, kann man da sonst wenig zu sagen.

Gruß, noisefloor

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 18:57
von m.g.o.d
Hi Zusammen,

danke für die Antworten. Also hier meine Funktion:

Code: Alles auswählen

    def build_path(self, videopath):
        """ search for the latest directory """
      
        files = os.listdir(videopath)
        paths = [os.path.join(videopath, basename) for basename in files]
        erg = max(paths, key=os.path.getctime)

        return erg
diese os.path.join() Funktion scheint bei manchen Pfaden das Problem zu sein, falls diese eben irgend eine Unicode Bedeutung haben...

Ich Übergebe der Funktion einen String als videopath:
K:\Deluxe Music

und das erg sieht dann in etwa so aus, was in machen Fällen eben zu meinem Problem wird:
K:\Deluxe Music\20042021\

müsste ich den String dann zu bytes codieren? Da die Strings aus os.listdir() kommen, kann ich da nirgends ein r"..." setzen.

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 19:14
von Sirius3
Nein, die gezeigte Funktion hat kein Problem mit \.
Zeige bitte den tatsächlichen Code und die dazugehörige Fehlermeldung.

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 19:26
von m.g.o.d
Okay. Folgende Funktion erhält den besagten Pfad als String:

Code: Alles auswählen

    def video_metadata(self, video_name):
        """ used for LON to grap clipduration and return it as timedelta obj and FPS. """
        try:
            media_info = MediaInfo.parse(video_name)
            
            for track in media_info.tracks:
                clip_dur = track.other_duration[4][:8]
                        
            # Convert Duration to datetime object
            clip_dur_datetime = datetime.strptime(clip_dur, "%H:%M:%S")

            # Convert into timedelta
            clip_dur_timedelta = dt.timedelta(hours=clip_dur_datetime.hour, minutes=clip_dur_datetime.minute, seconds=clip_dur_datetime.second)

            # Convert timedelta object in fps
            max_frames_sec = clip_dur_timedelta.total_seconds()
            max_frames_total = int(max_frames_sec) * 25

            if clip_dur_timedelta != None:      
                return clip_dur_timedelta, max_frames_total
Folgender Fehler wird NUR AB UND ZU geworfen:

2021-04-20 16:45:13,758 - ERROR - NoneType for: K:\Deluxe Music HD\2021-04-20\1618929600000-1618929900000.mp4
Traceback (most recent call last):
File "GraphicAlarmMachine.py", line 325, in run
TypeError: cannot unpack non-iterable NoneType object

Das NoneType tritt durch media_info auf, die eben auf den Pfad aufsetzt...und da es eben nur manchmal auftriff, dachte ich an ein Problem im Pfad. Das video ist tatsächlich ladbar, wenn ich den String mit r"K:\Deluxe Music HD\2021-04-20\1618929600000-1618929900000.mp4" testweise einlade. Ohne r".." wird ein Fehler zurückgegeben.

Folgender Fehler wird dann ausgegeben:

File "c:\Users\svcgam\Desktop\testung.py", line 269, in <module>
video_metadata_test(x)
File "c:\Users\svcgam\Desktop\testung.py", line 54, in video_metadata_test
media_info = MediaInfo.parse(path)
File "C:\Users\svcgam\AppData\Local\Programs\Python\Python39\lib\site-packages\pymediainfo\__init__.py", line 484, in parse
raise FileNotFoundError(filename)
FileNotFoundError: K:\Deluxe Music HD1-04-20q8929600000-1618929900000.mp4

Re: raw string für Variable?

Verfasst: Dienstag 20. April 2021, 22:21
von __blackjack__
@m.g.o.d: Ja, das ist doch aber ein anderer Fehler als der den Du bekommst. Wenn ich mal raten müsste: Du lässt Dir in `build_path()` den Dateinamen/Pfad für die neueste Datei geben. Das es die Datei gibt, heisst nicht, dass sie schon vollständig geschrieben wurde, und wenn das nicht der Fall ist, dann funktioniert das auslesen der Videoeigenschaften nicht.

Re: raw string für Variable?

Verfasst: Freitag 23. April 2021, 16:12
von m.g.o.d
__blackjack__ hat geschrieben: Dienstag 20. April 2021, 22:21 @m.g.o.d: Ja, das ist doch aber ein anderer Fehler als der den Du bekommst. Wenn ich mal raten müsste: Du lässt Dir in `build_path()` den Dateinamen/Pfad für die neueste Datei geben. Das es die Datei gibt, heisst nicht, dass sie schon vollständig geschrieben wurde, und wenn das nicht der Fall ist, dann funktioniert das auslesen der Videoeigenschaften nicht.
Danke sehr! Ja das macht tatsächlich Sinn und ich habe daran tatsächlich nicht gedacht :-) => Betriebsblind