Letztes Mal habe ich bisher eine große Anzahl von Bilddateien in Jahres- / Monatsordner sortiert. Zu diesem Zeitpunkt wurden in jedem Ordner die folgenden CSV-Dateien als Hinweise zum Löschen doppelter Dateien generiert.
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
Von links werden der Dateiname, CRC32 und die Dateigröße angezeigt, und Dateien mit derselben Dateigröße wie CRC32 sind mit ziemlicher Sicherheit dieselbe Datei, sodass sie gelöscht werden. Apropos obige Datei: Die 2. und 4. Zeile sind doppelt vorhanden, daher möchte ich sie wie folgt in zwei Gruppen unterteilen.
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
Die Idee ist einfach Liste löschen ← ursprüngliche Liste-doppelte Liste
und Überlebensliste ← ursprüngliche Liste-Liste löschen
, aber ich habe verschiedene Knetvorgänge versucht, konnte aber keine überzeugende Implementierung erreichen. Also diesmal
(Ich denke, das ist genug, weil das, was ich tun möchte, nicht kompliziert ist)
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 = {} #Was überlebt
delete_dict = {} #Ziel gelöscht werden
# filename,crc32,Dateigröße{filename, (crc32, filesize)}Zu
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():
#Ich möchte nur, dass der vollständige Pfad der Datei gelöscht wird
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))
In der ersten for-Anweisung wird das Inspektionsziel in {Dateiname, (crc32, Dateigröße)} konvertiert, damit es später problemlos verarbeitet werden kann. Wenn Sie es nicht zu einem Taple machen, müssen Sie überprüfen, ob CRC32 und Dateigröße enthalten sind, also ist es ein kleiner Mist. Obwohl saved_dict von Bedeutung ist, ist es auch dann nutzlos, wenn es in saved.txt ausgegeben wird, sodass eine Ausgabe nicht erforderlich ist (obwohl dies beim Debuggen hilfreich war).
Es ist immer noch Pythonista, also denke ich, dass es mit einer festgelegten Operation enden wird, aber diesmal. Als nächstes folgt der Löschvorgang unter Bezugnahme auf die Datei delete.txt, die in jedem Jahr / Monat-Ordner generiert wurde (was soll ich schreiben ...)
Recommended Posts