Medium erstellt auslesen

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
shuber
User
Beiträge: 4
Registriert: Freitag 19. Mai 2023, 20:03

Hallo zusammen,

ich habe einen Python Code geschrieben der mir für eine .mp4 Datei das Datum ausließt an dem es erstellt wurde und mir entsprechend die Datei umbennent. Bisher hat das auch immer super funktioniert, da ich die Dateien direkt von meiner Kamera auf den Rechner kopiert habe. Jetzt habe ich aber Video Dateien von einem Freund bekommen und dadurch hat sich das Änderungsdatum verändert. Die Information wann die Datei erstellt wurde ist aber immer noch vorhanden und zwar unter Eigenschaften -> Details -> Medium erstellt (Ich verwende Windows 10). Genau diese Zeit möchte ich auslesen aber ich schaffe es leider nur das Änderungsdatum auszulesen. Weiß jemand ob es möglich ist mit Python die Zeit "Medium erstellt" auszulesen?

Hier noch ein kleines Code Beispiel das ich aktuell verwende um die Zeit einzulesen:

Code: Alles auswählen

import os
import time

sourceDir = "G1/"
strExtension = ".MP4"

for file in os.listdir(sourceDir):
    if file.endswith(strExtension):
        sourcePath = os.path.join(sourceDir,file)
        creation_time = os.path.getmtime(sourcePath)
        creation_time = time.gmtime(creation_time)
        year = int(str(creation_time.tm_year)[2:]) 
        mon = creation_time.tm_mon 
        day = creation_time.tm_mday
        hour = creation_time.tm_hour
        
Vielen Dank und viele Grüße,
Simon
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Laut Doku (https://docs.python.org/3/library/os.pa ... h.getctime) geht es , ist aber Betriebssystem-abhängig ob man da die "Creation"-time erwischt oder nicht. Wobei man bei Windows offenbar Glück haben soll und dort die Creation-time bekommt.
Benutzeravatar
__blackjack__
User
Beiträge: 13937
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@shuber: Statt `os` und `time` würde man dafür in neuem Code eher `pathlib` und `datetime` verwenden. Selbst vor dem `pathlib`-Modul hätte sich das `glob`-Modul angeboten um das auflisten und filtern nach Dateinamensendungen in einem Aufruf zu erledigen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Der "/" im Verzeichnisnamen ist überflüssig und macht das ganze potentiell unnötig plattformabhängig.

Was soll das `str` in `strExtension` bedeuten? Falls das der Datentyp sein soll — Grunddatentypen haben in Namen nichts zu suchen.

Bei dem Namen `file` erwartet man ein Dateiobjekt, also etwas mit `read()`, `write()`, und `close()`-Methoden, nicht einen Datei*namen*.

An einen Namen sollte man im gleichen Gültigkeitsbereich verschiedene Datentypen binden. Das ist verwirrend. Man muss auch nicht jedes kleine Zwischenergebnis überhaupt an einen Namen binden.

Das Jahr von einer Zahl in eine Zeichenkette umwandeln, zwei Zeichen abschneiden, und dann wieder in eine Zahl wandeln ist ein bisschen durch die Brust ins Auge. Das wäre als Rechenoperation kürzer und klarer. Wobei sich auch so ein bisschen die Frage stellt wofür das alles an einzelne Namen gebunden wird, denn `datetime`-Objekte kann man mit f-Zeichenkettenliteral oder `format()`-Methode in eine Zeichenkette umwandeln. Da gibt's auch einen Platzhalter für eine zweistellige Jahresangabe, und man bekommt auch gleich die führenden 0en für die Komponenten frei Haus.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path
from datetime import datetime as DateTime


def main():
    source_path = Path("G1")
    filename_pattern = "*.MP4"

    for path in source_path.glob(filename_pattern):
        if path.is_file():
            creation_time = DateTime.fromtimestamp(path.stat().st_ctime)
            year = creation_time.year % 100
            month = creation_time.month
            day = creation_time.day
            hour = creation_time.hour
            print(year, month, day, hour)
            print(f"{creation_time:%y-%m-%d %H}")


if __name__ == "__main__":
    main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
shuber
User
Beiträge: 4
Registriert: Freitag 19. Mai 2023, 20:03

grubenfox hat geschrieben: Freitag 19. Mai 2023, 22:43 Laut Doku (https://docs.python.org/3/library/os.pa ... h.getctime) geht es , ist aber Betriebssystem-abhängig ob man da die "Creation"-time erwischt oder nicht. Wobei man bei Windows offenbar Glück haben soll und dort die Creation-time bekommt.
Danke, die Funktion os.path.getctime() habe ich auch schon versucht aber das liest mir an meinem Rechner das "Erstelldatum" aus aber nicht das Datum "Medium erstellt" in den Details. Ich befürchte fast, dass dies mit Python auf meinem Rechner nicht funktionieren wird.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Sollte sowas nicht in den Meta-Informationen der Dateien stecken? Statt im Filesystem?
shuber
User
Beiträge: 4
Registriert: Freitag 19. Mai 2023, 20:03

__blackjack__ hat geschrieben: Freitag 19. Mai 2023, 23:23 @shuber: Statt `os` und `time` würde man dafür in neuem Code eher `pathlib` und `datetime` verwenden. Selbst vor dem `pathlib`-Modul hätte sich das `glob`-Modul angeboten um das auflisten und filtern nach Dateinamensendungen in einem Aufruf zu erledigen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Der "/" im Verzeichnisnamen ist überflüssig und macht das ganze potentiell unnötig plattformabhängig.

Was soll das `str` in `strExtension` bedeuten? Falls das der Datentyp sein soll — Grunddatentypen haben in Namen nichts zu suchen.

Bei dem Namen `file` erwartet man ein Dateiobjekt, also etwas mit `read()`, `write()`, und `close()`-Methoden, nicht einen Datei*namen*.

An einen Namen sollte man im gleichen Gültigkeitsbereich verschiedene Datentypen binden. Das ist verwirrend. Man muss auch nicht jedes kleine Zwischenergebnis überhaupt an einen Namen binden.

Das Jahr von einer Zahl in eine Zeichenkette umwandeln, zwei Zeichen abschneiden, und dann wieder in eine Zahl wandeln ist ein bisschen durch die Brust ins Auge. Das wäre als Rechenoperation kürzer und klarer. Wobei sich auch so ein bisschen die Frage stellt wofür das alles an einzelne Namen gebunden wird, denn `datetime`-Objekte kann man mit f-Zeichenkettenliteral oder `format()`-Methode in eine Zeichenkette umwandeln. Da gibt's auch einen Platzhalter für eine zweistellige Jahresangabe, und man bekommt auch gleich die führenden 0en für die Komponenten frei Haus.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
from pathlib import Path
from datetime import datetime as DateTime


def main():
    source_path = Path("G1")
    filename_pattern = "*.MP4"

    for path in source_path.glob(filename_pattern):
        if path.is_file():
            creation_time = DateTime.fromtimestamp(path.stat().st_ctime)
            year = creation_time.year % 100
            month = creation_time.month
            day = creation_time.day
            hour = creation_time.hour
            print(year, month, day, hour)
            print(f"{creation_time:%y-%m-%d %H}")


if __name__ == "__main__":
    main()
Vielen Dank für die ganzen Hinweise. Ich werde in Zukunft mehr darauf achten den allgemein gültigen Regeln für die Bennung zu folgen. Wie man vermutlich sieht habe ich mir das Programmieren komplett selber beigebracht und hab auf solche Sachen bisher leider zu wenig Wert gelegt.

Den Code hab ich probiert und er funktioniert auch soweit, allerdings liest er mir nicht das Datum "Medium erstellt" in den Details der Datei aus. Die ausgelesenen Stunden liegen bei 19 und 20 wobei eigentlich eine Differenz von mindestens 5 h zwischen den Aufnahmen liegt. Interessanterweiße ist es weder das "Erstelldatum" noch das "Änderungsdatum". Mir scheint es so, als wie wenn Python nicht auf das Datum "Medium erstellt" zugreifen kann. Dann bleiben mir wohl nur zwei Lösungen, entweder 70 Dateien per Hand umbennen oder auf das sortieren der Dateien verzichten.
shuber
User
Beiträge: 4
Registriert: Freitag 19. Mai 2023, 20:03

__deets__ hat geschrieben: Samstag 20. Mai 2023, 08:41 Sollte sowas nicht in den Meta-Informationen der Dateien stecken? Statt im Filesystem?
Das kann gut sein da kenne ich mich leider nicht so aus. Kann ich auf die Meta-Informationen mit Python zugreifen? Wenn ich mir die Eigenschaften der Datei ansehe, sehe ich das die Information definitiv noch da ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es gibt diveres Bibliotheken, ffmpeg zB. Was genau hilft, kann man ohne die konkrete Datei zu haben, nicht sagen.
Antworten