2017-08-05 6 views
0

Angenommen habe ich eine set von Dateioperationen umbenennen:Umbenennen Satz von Dateien, wenn alte Namen Konflikt mit neuen Namen in Python3

renames={(current_1,new_1),(current_2,new_2),...} 

Es wird garantiert, dass die Dateien current_1,current_2,... vorhanden ist und dass die neuen Dateien new_1,new_2,... sind einzigartig. Alle Dateien sind Instanzen von pathlib.Path.

Sie können jedoch Dateien sein, die derzeit als eine andere Datei benannt werden müssen umbenannt werden: d. H. Es kann eine Instanz von current_i==new_j existieren.

Was wäre eine elegante Möglichkeit, die Umbenennungsoperationen zu implementieren? Beachten Sie, dass ich nicht einfach über renames iterieren und jede Datei umbenennen kann, da ich für eine Situation vorbereitet sein muss, in der der neue Name mit dem Namen einer Datei kollidiert, die noch umbenannt werden soll.

Ich bin speziell auf der Suche nach einer Implementierung in Python3, und ich möchte umbenannt werden, um eine set in der Form oben gehalten werden.

ist eine einfache Möglichkeit, vorübergehend die Dateien Präfix:

temporal_prefix="a big string guaranteed not to appear in file names" 
for current,new in renames: 
    current.rename(current.with_name(temporal_prefix+current.name)) 
for current,new in renames: 
    current.with_name(temporal_prefix+current.name).rename(new) 

Aber das ist nicht sehr elegant, und es erfordert die benötigten Dateioperationen zu verdoppeln. Und ein gutes Präfix zu finden, kann an sich schon ein Problem sein. Ist es möglich, dies in einer Schleife zu tun und die minimale Anzahl von Dateioperationen zu verwenden?

+0

Mit Ausdauer und harte Arbeit werden Sie wahrscheinlich dies zu lösen. – wwii

Antwort

1

Es gibt nicht viel Sinn zu versuchen, zu schlau zu sein, weil Umbenennen keine teure Operation ist und der Fehler, den Sie bekommen, wenn eine Datei existiert, ist ziemlich klar und kann gefangen und behandelt werden. Sie können sogar auf die Existenz jeder Datei testen und vermeiden, Fehler zu erfassen, wenn Sie möchten, aber wenn Sie denken, dass die meisten Dateien kein Problem haben, ist es wahrscheinlich Zeitverschwendung

Verwenden Sie einfach eine Datenstruktur wie eine Warteschlange Um Ihre Umbenennungen zu behalten, fangen Sie an, sie von Kopf bis Fuß zu verarbeiten, und wenn Sie einen Fehler aufgrund bestehender gefunden haben, setzen Sie die Umbenennung wieder auf das Ende der Warteschlange, damit Ihre Schleife später wieder dazu kommt. Die meisten Umbenennungen werden wahrscheinlich zum ersten Mal erfolgreich sein, diejenigen, die nicht erfolgreich sein werden, zum zweiten Mal

Ich habe keinen Beispielcode gepostet, weil ich Python nie in meinem Leben berührt habe (Entschuldigung). In Pseudocode würde ich:

While(renameQueue.hasItems) 
    to_rename = renameQueue.dequeue() 
    Try 
    File.Rename(to_rename.oldName, to-rename.newName) 
    OnError FILE_EXISTS 
    new_name = system.getRandomTempFilename() 
    File.Rename(to_rename.oldName, new_name) 
    to_rename.oldName = new_name 
    renameQueue.enqueue(to_rename) 
    End Try 
End While 
+1

Warten Sie ... Ich habe ein Problem mit diesem Problem. Für etwas wie [(A, B), (B, A)], wo sowohl A als auch B existieren ... wird die Schleife niemals verlassen. Im Allgemeinen passiert das, wenn es eine geschlossene "Kette" von Umbenennungen gibt. – Saulpila

+0

Es ist ein guter Punkt; es sieht wie ein ziemlich schmaler Fall aus, da es auf Paare beschränkt ist, die versuchen, die Namen über oder schlechter zu tauschen, Namen umkreisen (ab, bc, ca). Vielleicht erweitern Sie die Re-Enqueue-Logik so, dass sie die Datei jetzt in einen zufälligen Temp-Dateinamen umbenennt und dieses neue Paar Tempname-> gewünschtes Namen in die Warteschlange einfügt –

+0

Pseudocode hinzugefügt –

Verwandte Themen