Ich bin eine alte Person, also bin ich im Grunde eine Gruppe "Dinge machen, die es nicht gibt".
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.
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)
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).
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