Tri des fichiers image avec Python

Préface

Depuis que je suis une personne âgée

thème

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.

  1. Le dossier de destination de tri est dst \ yyyymm (classé par année et par mois pour le moment)
  2. aaaamm est déterminé à partir de DateTimeOriginal d'Exif
  3. Une image avec Exif mais sans DateTimeOriginal ou sans Exif est déterminée à partir de l'horodatage (date et heure de la dernière modification) du fichier.
  4. Si un fichier portant le même nom existe déjà dans le dossier de destination du tri, ajoutez le numéro de série "(1)" à la fin du nom de fichier et triez-le dans un état unique.
  5. Puisque je veux supprimer les fichiers en double plus tard, générez un fichier csv qui affiche le nom de fichier, CRC32 et la taille du fichier sur une ligne pour chaque dossier aaaamm.
  6. Les formats cibles sont uniquement .jpg et .png (.gif et .bmp devraient être presque inexistants et .q4 et .mag sont désormais abandonnés)

Environnement de développement

code

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)

J'ai essayé de l'utiliser

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)

Épilogue

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

Tri des fichiers image avec Python (2)
Tri des fichiers image avec Python (3)
Tri des fichiers image avec Python
Traitement d'image avec Python
Traitement d'image avec Python (partie 2)
Trier de gros fichiers avec python
Traitement d'image avec Python (partie 1)
Tweet avec image en Python
Intégrez des fichiers PDF avec Python
Traitement d'image avec Python (3)
Lire des fichiers .txt avec Python
[Python] Traitement d'image avec scicit-image
Extraire le tableau des fichiers image avec OneDrive et Python
Découpez une image avec python
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Extraire récursivement des fichiers zip avec python
Manipulation des fichiers EAGLE .brd avec Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
[Python] Fichiers wav POST avec requêtes [POST]
Décrypter les fichiers cryptés avec OpenSSL avec Python 3
Faisons du scraping d'images avec Python
Gérer les fichiers Excel CSV avec Python
Lire des fichiers en parallèle avec Python
Trouver la similitude d'image avec Python + OpenCV
100 traitement d'image par Python Knock # 2 Échelle de gris
Envoyer l'image avec python et enregistrer avec php
Tri des fichiers par convention de dénomination à l'aide de Python
Génération d'images dégradées avec Python [1] | np.linspace
[Python] Envoyer gmail avec python: envoyez un par un avec plusieurs fichiers image en pièce jointe
[Python] Lecture facile des fichiers image du numéro de série avec OpenCV
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
[AWS] Utilisation de fichiers ini avec Lambda [Python]
FizzBuzz en Python3
Grattage avec Python
Lire un fichier audio à partir de Python avec interruption
traitement d'image python
Statistiques avec python
Grattage avec Python
Créez une image factice avec Python + PIL.
Python avec Go
100 traitement d'image avec Python Knock # 8 Max Pooling
Introduction au remplissage d'image Python Remplissage d'image à l'aide d'ImageDataGenerator
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
Décrypter les fichiers cryptés avec openssl depuis python avec openssl
AES256 avec python
Utiliser le chiffrement de la bibliothèque de chiffrement avec l'image Python de Docker
Traitement d'image avec Python et OpenCV [Tone Curve]
Testé avec Python
python commence par ()
Acquisition d'images depuis une caméra avec Python + OpenCV
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
Lire et écrire des fichiers JSON avec Python
Télécharger des fichiers sur le Web avec Python
[Easy Python] Lecture de fichiers Excel avec openpyxl
avec syntaxe (Python)
Bingo avec python
Dessin avec Matrix-Reinventor of Python Image Processing-
Zundokokiyoshi avec python