2017-06-09 5 views
1

LÖSUNG siehe EDIT am Ende dieses Kommentars.Suchen Sie doppelte Dateien mit verschiedenen Erweiterungen mit Python

PROBLEM: Ich habe ein Verzeichnis mit einem Haufen von Bildern, mit dem Namen etwas wie unten:

  • image001.nef
  • image002.nef
  • image003.nef
  • image003 - 20170609.jpg
  • image004.nef
  • image005.nef
  • image006 - 20170609.nef
  • image007.nef
  • image007 - 20170609.jpg
  • image008.jpg
  • image008 - 20170609.nef

Ich möchte alle Bilder finden, die ein doppelter Basisname sind (wie imageXXX) UND die Erweiterung ist JPG

Also von meiner obigen Liste gibt es nur drei Elemente, die die Kriterien zum Löschen entsprechen (ich habe fett diese Elemente).

Ich habe 2500 Bilder, also ist ein pythonischer Weg wünschenswert, den ich manuell durchlaufe.

Es fällt mir schwer, ein Beispielskript zu finden, alle, die ich gefunden habe, überprüfen das HASH oder etwas, was ich nicht für nützlich halte, da die Bilder zwar ähnlich, aber nicht identisch sind.

Prost

EDIT: Dank konnte ich Dawg die Ausgabe Ich wünsche ... hier ist der letzte Code erhalten, die für mich gearbeitet:

import os 

directory = r'C:\temp' 
out_directory = r'C:\temp\temp_usa_photos' 
fns = os.listdir(directory) 


ref_nef = {fn[0:15] for fn in fns if fn.upper().endswith('.NEF')} 

print ref_nef 

out_list = filter(lambda e: e[0:15] in ref_nef, [fn for fn in fns if fn.upper().endswith('.JPG')]) 

print out_list 

for f in out_list: 
    input_file = os.path.join(directory, f) 
    output_file = os.path.join(out_directory, f) 
    os.rename(input_file, output_file) 
+0

Was hast du bisher gemacht? – moritzg

+0

Sie müssen diese nur anhand des Dateinamens löschen?Ich verstehe nicht genau, was Sie daran hindert, alle Bilder zu durchlaufen, Basisnamen zu extrahieren, sie in ein Diktat/eine Liste zu schreiben und dann alle weiteren gefundenen Duplikate zu entfernen. – Euphe

+0

@moritzg Ich habe gerade Code zu ursprünglichen Kommentar hinzugefügt – Benno

Antwort

1

Gegeben:

>>> fns 
['image001.nef', 'image002.nef', 'image003.nef', 'image003 - 20170609.jpg', 'image004.nef', 'image005.nef', 'image006 - 20170609.nef', 'image007.nef', 'image007 - 20170609.jpg', 'image008.jpg', 'image008 - 20170609.nef'] 

(Ich kann diese Liste als Proxy für eine Liste von Dateinamen verwenden. Verwenden Sie einfach eine glob oder listdir für Dateien ...)

Wenn Ihr Dateinamen alle Form imageXXX sind, können Sie zunächst, dass verwenden, um eine Reihe von Dateinamen ersten 8 Buchstaben der .nef Dateien zu erstellen:

>>> ref_nef={fn[0:8] for fn in fns if fn.upper().endswith('.NEF')} 
>>> ref_nef 
set(['image008', 'image005', 'image004', 'image007', 'image006', 'image001', 'image003', 'image002']) 

dann, dass die .jpg Dateien zu filtern, verwenden, um löschen:

>>> filter(lambda e: e[0:8] in ref_nef, [fn for fn in fns if fn.upper().endswith('.JPG')]) 
['image003 - 20170609.jpg', 'image007 - 20170609.jpg', 'image008.jpg'] 
+0

Ich frage mich, ob es eine sehr einfache Lösung für mein neues Problem ist. Ihre Lösung hat 99% meines Problems behoben, aber ich habe gerade herausgefunden, dass es einige Rogue-NEF-Dateien gibt. Wenn Sie [diesen Screenshot] sehen (http://i1355.photobucket.com/albums/q718/some_evil/2017-06-12%2020_44_20-temp_zpslkhxvmnt.jpg), können Sie einige doppelte NEF-Dateien sehen, ich frage mich, ob Es gibt eine Möglichkeit, meinen Ordner von allen NEFER Nef-Dateien zu befreien. In diesem Fall muss der oberste gehen, er wird einen längeren Namen haben und neuer sein. Kannst du mit diesem helfen? Vielen Dank für Ihre Hilfe! – Benno

+0

Wenn dies 99% tut, dann verwenden Sie dies. Danach können Sie einen Dup-Find-Ansatz verwenden, bei dem Sie die Datei tatsächlich lesen und vergleichen. Ein MD5-Hash ist dafür nützlich. Viel Glück. Stellen Sie eine neue Frage, wenn Sie nicht weiterkommen – dawg

Verwandte Themen