Metadaten eines Files auslesen (nicht unbedingt ein Bild)

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
Benutzeravatar
Ant-on-Hu
User
Beiträge: 17
Registriert: Sonntag 18. Juni 2017, 16:21

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
Benutzeravatar
sparrow
User
Beiträge: 4244
Registriert: Freitag 17. April 2009, 10:28

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

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

@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()
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Benutzeravatar
Ant-on-Hu
User
Beiträge: 17
Registriert: Sonntag 18. Juni 2017, 16:21

@_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!
Antworten