raw string für Variable?

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
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

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
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
noisefloor
User
Beiträge: 4187
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

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.
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, die gezeigte Funktion hat kein Problem mit \.
Zeige bitte den tatsächlichen Code und die dazugehörige Fehlermeldung.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

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
Benutzeravatar
__blackjack__
User
Beiträge: 14030
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
m.g.o.d
User
Beiträge: 75
Registriert: Samstag 4. April 2020, 13:17

__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
Antworten