Bilddateien mit Python sortieren

Vorwort

Ich bin eine alte Person, also bin ich im Grunde eine Gruppe "Dinge machen, die es nicht gibt".

Thema

Dieses Mal werden die Bilder, wie der Titel schon sagt, sortiert. Wahrscheinlich aus dem Jahr 2000 weiß ich nicht, wie viele Dateien vorhanden sind, z. B. Fotos, die mit einer Digitalkamera oder einem Smartphone aufgenommen wurden, heruntergeladene Hintergrundbilder, Screenshots usw., und ein schnappschussartiges Backup wird zu einem bestimmten Zeitpunkt auf mehreren Festplatten gespeichert, sodass es sich in einem sehr chaotischen Zustand befindet. Nun, man kann sagen, dass es in gewissem Sinne eine Risikoabsicherung ist, es mit Verteilung und Redundanz zu speichern.

--HDD1: Bis zu 2000 Blatt --HDD2: Bis zu 2500 Blatt --HDD3: Bis zu 3000 Blatt

Es gibt viele Duplikate, und das Wrack, das ich zuvor ein wenig sortiert hatte, verbleibt im Dateinamen (1) .jpg. Daher dachte ich, ich sollte das Duplizieren weglassen und es auf eine neue Festplatte legen und auf Amazon Photos hochladen.

  1. Der Sortierzielordner lautet dst \ yyyymm (vorerst nach Jahr und Monat klassifiziert).
  2. yyyymm wird aus dem DateTimeOriginal von Exif bestimmt
  3. Ein Bild mit Exif, jedoch ohne DateTimeOriginal oder ohne Exif wird aus dem Zeitstempel (Datum und Uhrzeit der letzten Änderung) der Datei ermittelt.
  4. Wenn bereits eine Datei mit demselben Namen im Sortierzielordner vorhanden ist, fügen Sie die Seriennummer "(1)" am Ende des Dateinamens hinzu und sortieren Sie sie in einem eindeutigen Zustand.
  5. Da ich doppelte Dateien später löschen möchte, generieren Sie eine CSV-Datei, die den Dateinamen, CRC32 und die Dateigröße in einer Zeile für jeden JJJJMM-Ordner ausgibt.
  6. Zielformate sind nur .jpg und .png (.gif und .bmp sollten fast nicht mehr vorhanden sein und .q4 und .mag werden nicht mehr aufgegeben)

Entwicklungsumgebung

Code

Nur der Ort, an dem crc32 abgerufen werden kann, kann später wiederverwendet werden. Fügen Sie ihn daher in ein anderes Modul ein.

mycrc32.py


import binascii
import glob
import os
import sys

#Holen Sie sich CRC32 der Datei
def get_crc32(file):
    with open(file, "rb") as f:
        barray = f.read()
    return binascii.crc32(barray, 0)

# {Dateiname, CRC32, Dateigröße}Ausgabe
def output_info(srcFolder):
    files = glob.glob(os.path.join(srcFolder, "*.*"), recursive=True)
    infofile = os.path.join(srcFolder, "info.csv")

    if os.path.isfile(infofile):
        os.remove(infofile)

    for file in files:
        with open(infofile, "a") as f:
            efull = os.path.join(srcFolder, file)
            crc32 = get_crc32(efull)
            f.write(f"{os.path.basename(efull)},{hex(crc32)},{os.path.getsize(file)}\n")

Dies ist der Hauptteil.

PictureSorter.py


import datetime
import os
import glob
from PIL import Image
from PIL.ExifTags import TAGS
import shutil
import sys
import mycrc32

#Exif-Informationen abrufen
def get_exif_of_image(file):
    img = Image.open(file)

    try:
        exif = img._getexif()
    except AttributeError:
        return {}
    exifTable = {}

    if exif is not None:
        for key in exif.keys():
            tag = TAGS.get(key, key)
            exifTable[tag] = exif[key]
    return exifTable

#Ruft das Datum und die Uhrzeit der letzten Änderung der Datei ab
def get_last_write_time(file):
    t = os.path.getmtime(file)
    return datetime.datetime.fromtimestamp(t)

#Rufen Sie den Namen des Zielunterordners ab
def get_destination_folder(file):
    exifTable = get_exif_of_image(file)

    if exifTable is not None:
        t = exifTable.get('DateTimeOriginal')

        if t is not None:
            t = datetime.datetime.strptime(t, '%Y:%m:%d %H:%M:%S')
        else:
            t = get_last_write_time(file)
    else:
        t = get_last_write_time(file)

    return t.strftime("%Y%m")

#Legen Sie bei doppelten Dateinamen einen eindeutigen Dateinamen fest
def ensure_filename(dfull):
    path = os.path.dirname(dfull)
    pureName = os.path.splitext(os.path.basename(dfull))[0]
    ext = os.path.splitext(os.path.basename(dfull))[1]

    newName = f"{os.path.join(path, pureName)}{ext}"

    i = 0
    while os.path.isfile(newName):
        i += 1
        newName = f"{os.path.join(path, pureName)}({i}){ext}"

    return newName

if __name__ == "__main__":
    _SOURCE_FOLDER = sys.argv[1]
    _DESTINATION_FOLDER = sys.argv[2]

    def get_ext(file):
        return os.path.splitext(os.path.basename(file))[1].lower()

    if (len(sys.argv) != 3):
        print("PictureSorter.py srcFolder dstFolder")
        x = input()
        exit
    else:
        print(f"srcFolder={_SOURCE_FOLDER}")
        print(f"dstFolder={_DESTINATION_FOLDER}")
        print("any key to go!")
        x = input()

    files = glob.glob(os.path.join(_SOURCE_FOLDER, "*.*"), recursive=True)

    for file in filter(lambda file: get_ext(file) in [ ".jpg ", ".png " ], files):
        dstfol = get_destination_folder(file)
        dfol = os.path.join(_DESTINATION_FOLDER, dstfol)

        if not os.path.exists(dfol):
            os.makedirs(dfol, exist_ok=True)

        #Datei bewegen(Wenn Sie das sagen, ist das Verlorene beängstigend. Kopieren Sie es also einmal und löschen Sie es später)
        dfull = os.path.join(dfol, os.path.basename(file))
        efull = ensure_filename(dfull)
        print(f"{file} -> {efull}")
        shutil.copy2(file, efull)       #Wenn Sie verschieben möchten, verwenden Sie move anstelle von copy2

    #Dateiname / CRC32 / Dateigrößenausgabe
    mycrc32.output_info(dfol)

Ich habe es versucht

Dies funktioniert nach Bedarf, aber was ist mit der Realität? Mit einem Smartphone aufgenommene Alltagsfotos (sogenannte Familienfotos) und Spiel-Screenshots können sich nicht im selben Ordner befinden, nur weil sie dasselbe Datum haben. Ordner für jede Kategorie sind auf einer höheren Ebene erforderlich. Sobald die Kategorie festgelegt ist, ist die Anforderung zum Verschieben in den untergeordneten Ordner mit diesem Code erfüllt.

In diesem Fall ist dies sehr problematisch, es ist jedoch angebracht, die Bilddatei, die Sie verschieben möchten, nach Auswahl der Zielkategorie im GUI-Formular zu verschieben, während Sie das reduzierte Bild mit dem Explorer betrachten. Ich finde es cool, maschinelles Lernen die Zielkategorie bestimmen zu lassen, aber mit dem aktuellen Wissen ist das (Schweiß)

Aus diesem Grund habe ich ein wenig recherchiert, aber es scheint, dass es in den Ferien nicht enden wird, da es verschiedene Dinge gibt, wie die Implementierung mit wxPython von der Methode der Verwendung der Windows-API und die Implementierung in 3.9.0 (eigentlich mache ich es während der Sommerferien) Nur der GUI-Teil wird in C # geschrieben, um den Tee schlammig zu machen (die C # -Seite ist keine große Sache, daher werde ich sie weglassen).

Nachwort

Vielleicht gibt es mehr Python-ähnlichen Code, aber es ist offensichtlich, also hier. In letzter Zeit ist das Gefühl der Folientastatur unangenehm geworden, deshalb habe ich sie zum ersten Mal seit mehreren Jahren durch eine mechanische Tastatur (brauner Schaft) ersetzt. Es macht Spaß, die Tasten zu drücken!

Recommended Posts

Sortieren von Bilddateien mit Python (2)
Sortieren von Bilddateien mit Python (3)
Bilddateien mit Python sortieren
Bildverarbeitung mit Python
Bildverarbeitung mit Python (Teil 2)
Sortieren Sie große Dateien mit Python
Bildverarbeitung mit Python (Teil 1)
Tweet mit Bild in Python
Integrieren Sie PDF-Dateien in Python
Bildverarbeitung mit Python (3)
TXT-Dateien mit Python lesen
[Python] Bildverarbeitung mit Scicit-Image
Extrahieren Sie die Tabelle der Bilddateien mit OneDrive & Python
Schneiden Sie ein Bild mit Python aus
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
Extrahieren Sie Zip-Dateien rekursiv mit Python
Bearbeiten von EAGLE .brd-Dateien mit Python
[Python] Verwenden von OpenCV mit Python (Bildtransformation)
[Python] POST-WAV-Dateien mit Anforderungen [POST]
Mit OpenSSL mit Python 3 verschlüsselte Dateien entschlüsseln
Lassen Sie uns mit Python Image Scraping durchführen
Behandeln Sie Excel-CSV-Dateien mit Python
Lesen Sie Dateien parallel zu Python
Finden Sie Bildähnlichkeit mit Python + OpenCV
100 Bildverarbeitung mit Python Knock # 2 Graustufen
Sende Bild mit Python und speichere mit PHP
Sortieren von Dateien nach Namenskonvention mit Python
Erzeugung von Verlaufsbildern mit Python [1] | np.linspace
[Python] Google Mail mit Python senden: Senden Sie eins nach dem anderen mit mehreren angehängten Bilddateien
[Python] Mit OpenCV können Sie problemlos Bilddateien mit Seriennummern lesen
Grundlagen der binärisierten Bildverarbeitung durch Python
Bildverarbeitung mit Python 100 Knock # 10 Medianfilter
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
FizzBuzz in Python3
Scraping mit Python
Spielen Sie eine Audiodatei von Python mit Interrupt ab
Python-Bildverarbeitung
Statistik mit Python
Scraping mit Python
Erstellen Sie mit Python + PIL ein Dummy-Image.
Python mit Go
100 Bildverarbeitung mit Python Knock # 8 Max Pooling
Einführung in das Auffüllen von Python-Bildern Auffüllen von Bildern mit ImageDataGenerator
Twilio mit Python
In Python integrieren
Spielen Sie mit 2016-Python
Mit openssl verschlüsselte Dateien werden mit openssl aus Python entschlüsselt
AES256 mit Python
Verwenden Sie die Verschlüsselung der Verschlüsselungsbibliothek mit dem Python-Image von Docker
Bildverarbeitung mit Python & OpenCV [Tonkurve]
Getestet mit Python
Python beginnt mit ()
Bildaufnahme von der Kamera mit Python + OpenCV
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Lesen und Schreiben von JSON-Dateien mit Python
Laden Sie mit Python Dateien im Web herunter
[Easy Python] Lesen von Excel-Dateien mit openpyxl
mit Syntax (Python)
Bingo mit Python
Zeichnen mit Matrix-Reinventor von Python Image Processing-
Zundokokiyoshi mit Python