Dernière fois, j'ai fait jusqu'à présent pour trier un grand nombre de fichiers image dans des dossiers année / mois. À ce moment-là, les fichiers CSV suivants ont été générés dans chaque dossier comme indices pour supprimer les fichiers en double.
info.csv
IMG_2607.jpg,BCF3E765,1944106
IMG_2607(1).jpg,BCF3E765,1944106
IMG_2608.jpg,02B27221,3109397
IMG_2608(1).jpg,02B27221,3109397
010(8).jpg,E4A68AB2,3801239
010(9).jpg,3EBBC7BD,1841698
010(10).jpg,B9431E60,103645
À partir de la gauche, le nom du fichier, CRC32 et la taille du fichier sont affichés, et les fichiers avec la même taille de fichier que CRC32 seront presque certainement le même fichier, ils seront donc supprimés. En parlant du fichier ci-dessus, les 2ème et 4ème lignes sont dupliquées, je voudrais donc les diviser en 2 groupes comme suit.
servived
IMG_2607.jpg,BCF3E765,1944106
IMG_2608.jpg,02B27221,3109397
010(8).jpg,E4A68AB2,3801239
010(9).jpg,3EBBC7BD,1841698
010(10).jpg,B9431E60,103645
delete
IMG_2607(1).jpg,BCF3E765,1944106
IMG_2608(1).jpg,02B27221,3109397
L'idée est simplement «supprimer la liste ← liste originale en double» et «liste de survie ← liste originale à supprimer», mais j'ai essayé divers malaxages mais je n'ai pas pu parvenir à une implémentation convaincante. Alors cette fois
(Je pense que cela suffit car ce que je veux faire n'est pas compliqué)
Classify.py
import os
import sys
import pandas as pd
def classify(path, target):
lines = pd.read_csv(os.path.join(path, target), header=None)
d = {}
servived_dict = {} #Ce qui survit
delete_dict = {} #Cible à supprimer
# filename,crc32,taille du fichier{filename, (crc32, filesize)}À
for i in range(len(lines)):
(filename, crc32, filesize) = lines.values[i]
d[filename] = (crc32, filesize)
for key, value in d.items():
if value in servived_dict.values():
delete_dict[key] = value
else:
servived_dict[key] = value
def output(full_path, dic):
with open(full_path, mode='w') as f:
for key in dic.keys():
#Je veux seulement que le chemin complet du fichier soit supprimé
f.write(os.path.join(path, key) + "\n")
output(os.path.join(path, "servived.txt"), servived_dict)
output(os.path.join(path, "delete.txt"), delete_dict)
if __name__ == "__main__":
full_path = sys.argv[1]
classify(os.path.dirname(full_path), os.path.basename(full_path))
Dans la première instruction for, la cible d'inspection est convertie en {filename, (crc32, filesize)} afin qu'elle puisse être manipulée facilement plus tard. Si vous n'en faites pas un taple, vous devrez vérifier si CRC32 et la taille du fichier sont inclus, donc c'est une petite merde. De plus, bien que save_dict ait une signification, il est inutile même s'il est sorti vers saved.txt, donc la sortie est inutile (bien que cela ait été utile lors du débogage)
C'est toujours Pythonista, donc j'ai l'impression que cela se terminera par une opération set, mais cette fois. Vient ensuite le processus de suppression en se référant au fichier delete.txt généré dans chaque dossier année / mois (que dois-je écrire ...)
Recommended Posts