Depuis que je suis une personne âgée
Cette fois, comme le titre l'indique, les images sont triées. Probablement à partir d'environ 2000, je ne sais pas combien de fichiers il y a, tels que des photos prises avec un appareil photo numérique ou un smartphone, des fonds d'écran téléchargés, des captures d'écran, etc., et une sauvegarde de type instantané à un certain moment est stockée sur plusieurs disques durs, elle est donc dans un état très chaotique. Eh bien, on peut dire que c'est une couverture de risque dans un sens pour le stocker avec distribution et redondance.
--HDD1: jusqu'à 2000 feuilles --HDD2: jusqu'à 2500 feuilles --HDD3: jusqu'à 3000 feuilles
Il y a beaucoup de duplication, et l'épave que j'avais triée un peu avant reste dans le nom de fichier (1) .jpg, alors j'ai pensé que je devrais omettre la duplication et la mettre dans un nouveau disque dur et la télécharger sur Amazon Photos.
Seul l'endroit pour obtenir crc32 peut être réutilisé plus tard, alors mettez-le dans un autre module.
mycrc32.py
import binascii
import glob
import os
import sys
#Obtenez CRC32 du fichier
def get_crc32(file):
with open(file, "rb") as f:
barray = f.read()
return binascii.crc32(barray, 0)
# {Nom de fichier, CRC32, taille de fichier}Pour sortir
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")
C'est le corps principal.
PictureSorter.py
import datetime
import os
import glob
from PIL import Image
from PIL.ExifTags import TAGS
import shutil
import sys
import mycrc32
#Obtenir des informations Exif
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
#Obtenez la date et l'heure de la dernière modification du fichier
def get_last_write_time(file):
t = os.path.getmtime(file)
return datetime.datetime.fromtimestamp(t)
#Obtenez le nom du sous-dossier de destination
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")
#Choisissez un nom de fichier unique lors de la duplication de noms de fichiers
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)
#Déplacer le fichier(En disant cela, la perte est effrayante, alors copiez-la une fois et effacez-la plus tard)
dfull = os.path.join(dfol, os.path.basename(file))
efull = ensure_filename(dfull)
print(f"{file} -> {efull}")
shutil.copy2(file, efull) #Si vous souhaitez déplacer, utilisez move au lieu de copy2
#Nom de fichier / CRC32 / taille de fichier en sortie
mycrc32.output_info(dfol)
Cela fonctionne comme requis, mais qu'en est-il de la réalité? Les photos de tous les jours prises avec un smartphone (dites photos de famille) et les captures d'écran de jeux ne peuvent pas être dans le même dossier simplement parce qu'elles ont la même date. Les dossiers pour chaque catégorie sont requis à un niveau supérieur. Une fois la catégorie décidée, l'exigence de déplacement vers le dossier subordonné est satisfaite avec ce code.
Dans ce cas, c'est très gênant, mais il convient de D & D le fichier image que vous souhaitez déplacer après avoir sélectionné la catégorie de destination sur le formulaire GUI tout en visualisant l'image réduite avec l'Explorateur. Je pense que c'est cool de laisser l'apprentissage automatique déterminer la catégorie de destination, mais avec les connaissances actuelles, c'est (transpirer)
C'est pourquoi j'ai fait un peu de recherche, mais il semble que cela ne se terminera pas pendant les vacances car il y a diverses choses telles que l'implémentation en utilisant wxPython de la méthode d'utilisation de l'API Windows et elle sera installée en 3.9.0 (en fait je le fais pendant les vacances d'été) Cette fois Seule la partie GUI sera écrite en C # pour rendre le thé boueux (le côté C # n'est pas un gros problème, je vais donc l'omettre)
Peut-être qu'il y a plus de code de type Python, mais c'est évident, donc ici. Récemment, la sensation du clavier à membrane est devenue désagréable, je l'ai donc remplacé par un clavier mécanique (manche marron) pour la première fois depuis plusieurs années. C'est amusant de frapper les touches!
Recommended Posts