Seite 1 von 1

Metadaten eines Files auslesen (nicht unbedingt ein Bild)

Verfasst: Dienstag 7. September 2021, 08:51
von Ant-on-Hu
Hallo in die Runde,
ich hab ein kleines Script geschrieben, dass mir Dateien so umbenennen soll, dass das Erstelldatum vor dem Dateinamen steht, aus beispiel.txt wird dann 2021-09-07 beispiel.txt. Dazu ziehe ich die Dateien, die ich umbenennen möchte einfach auf die Scriptdatei:

Code: Alles auswählen

from pathlib import Path
import sys
from datetime import datetime

for arg in sys.argv[1:]:
    f = Path(arg)
    c = datetime.fromtimestamp(f.stat().st_ctime).strftime("%Y-%m-%d")
    if c:
        f.rename(Path(f.parent, f"{c} {f.stem + f.suffix}"))
Funktioniert auch soweit ganz gut, allerdings ändert Window das Erstelldatum immer, wenn die Datei z.B. von einer Festplatte auf die andere kopiert wurde. Das hat dann so witzige Folgen wie, dass das Datum der letzten Änderung älter ist als das Datum der Erstellung.
In den Eigenschaften der Datei finde ich aber unter Details - Ursprung - Inhalt erstellt noch das urspüngliche (richtige) Datum.
Hat jemand eine Idee, wie ich dieses Datum auslesen könnte?

Schöne Grüße
Anton

Re: Metadaten eines Files auslesen (nicht unbedingt ein Bild)

Verfasst: Dienstag 7. September 2021, 10:24
von sparrow
Dieser Bereich "Ursprung" ist nichts, womit man pauschal arbeiten kann. Es handelt sich um ein Dateiformat, das die dort enthaltenen Daten enthält. Der Explorer (oder was auch immer diese Datei-Eigenschaften anzeigt) weiß, wie es die Daten ausliest und zeigt sie an. Du müsstest also ein Modul finden, das speziell diesen Typ von Dateien verarbeiten kann und diese Information auslesen. Bei Bildern steht das wahrscheinlich in den EXIF-Daten und kann mit pillow ausgelesen werden.

Re: Metadaten eines Files auslesen (nicht unbedingt ein Bild)

Verfasst: Dienstag 7. September 2021, 10:45
von Sirius3
@Ant-on-Hu: Variablennamen sollten aussagekräftig sein, arg, f und c sind das nicht.
Wenn man den Namensteil eines Pfades ändern will, gibt es with_name. `c` ist immer wahr.

Code: Alles auswählen

for filename in map(Path, sys.argv[1:]):
    creation_date = datetime.fromtimestamp(f.stat().st_ctime)
    new_filename = filename.with_name(f"{creation_date:%Y-%m-%d} {f.name}")
    filename.rename(new_filename)

Re: Metadaten eines Files auslesen (nicht unbedingt ein Bild)

Verfasst: Dienstag 7. September 2021, 10:48
von __blackjack__
@Ant-on-Hu: Anmerkungen zum Code: `f` und `c` sind keine guten Namen. Die dürfen gerne sprechender sein.

`strftime()` würde ich hier nicht benutzen, denn die Formatierung kann man auch innerhalb der `format()`-Syntax im Platzhalter angeben.

`datetime`-Objekte sind immer ”wahr”, das heisst statt ``if c:`` könnte man auch ``if True:`` schreiben, und das macht keinen Sinn, weil man es dann auch einfach weg lassen kann.

``f.stem + f.suffix`` ist das selbe wie ``f.name``.

Und um einen Pfad mit einem anderen Dateinamen zu erzeugen, gibt es die `with_name()`-Methode, was verständlicher ist als einen neuen Pfad aus `parent` und einem Namen zu erzeugen.

Ungetestet:

Code: Alles auswählen

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


def main():
    for path in map(Path, sys.argv[1:]):
        create_time = DateTime.fromtimestamp(path.stat().st_ctime)
        path.rename(path.with_name(f"{create_time:%Y-%m-%d} {path.name}"))


if __name__ == "__main__":
    main()

Re: Metadaten eines Files auslesen (nicht unbedingt ein Bild)

Verfasst: Dienstag 7. September 2021, 11:18
von Ant-on-Hu
@_blackjack_ und @Sirius: Danke für die Hinweise, mit den Variablennamen und besonders mit der if-Abfrage habt Ihr Recht! :-)

@ sparrow: Ich hab sowas schon fast befürchtet. Ich probiere mal, dass ich verschiedene Bibliotheken einbinde und je nach Dateiformat das richtige Datum auslese. Ich denke aber auch, je mehr Bibliotheken ich einbinde, desto langsamer wird das Skript laufen. Momentan finde ich es auch ziemlich cool, dass ich Dateien, die ich umbenennen möchte, einfach auf das Skript ziehen kann.
Nochmals Danke für Eure Hilfe!