Batch 100K Dateien mit Python Umbenennung
-
28-09-2019 - |
Frage
Ich habe einen Ordner mit mehr als 100.000 Dateien, die alle mit dem gleichen Stub nummerierten, aber ohne führende Nullen, und die Zahlen sind nicht immer zusammenhängend (in der Regel sind sie, aber es gibt Lücken) z:
file-21.png,
file-22.png,
file-640.png,
file-641.png,
file-642.png,
file-645.png,
file-2130.png,
file-2131.png,
file-3012.png,
etc.
möchte ich Batch-Verfahren wie diese gepolstert, zusammenhängende Dateien zu erstellen. z:
file-000000.png,
file-000001.png,
file-000002.png,
file-000003.png,
Wenn ich den Ordner mit for filename in os.listdir('.'):
analysiere die Dateien kommen nicht in der Reihenfolge, bis ich zu ihnen mag. Verständlicherweise kommen sie nach oben
file-1,
file-1x,
file-1xx,
file-1xxx,
usw. dann
file-2,
file-2x,
file-2xx,
usw. Wie kann ich es in der Reihenfolge des numerischen Wertes zu durchlaufen? Ich bin eine komplette Python noob, aber Blick auf dem docs Ich vermute, ich Karte verwenden könnte eine neue Liste zu erstellen, die nur der numerische Teil Ausfiltern und dann sortieren, dass die Liste, dann Iterierte das? Mit mehr als 100 K-Dateien könnte dies schwer sein. Irgendwelche Tipps willkommen!
Lösung 3
Vielen Dank für Ihre Anregungen, ich werde versuchen, sie alle die verschiedenen Ansätze zu lernen. Die Lösung, die ich für ging zugrunde, eine natürliche Art auf meiner Liste der Dateien über die Verwendung und dann iteriert, dass umbenennen. Dies war eine der vorgeschlagenen Antworten, aber aus irgendeinem Grund hat es jetzt verschwunden, damit ich es nicht als angenommen markieren!
import os
files = os.listdir('.')
natsort(files)
index = 0
for filename in files:
os.rename(filename, str(index).zfill(7)+'.png')
index += 1
Dabei gilt natsort definiert in http://code.activestate.com / Rezepte / 285264-natural-String-Sortieranlagen /
Andere Tipps
import re
thenum = re.compile('^file-(\d+)\.png$')
def bynumber(fn):
mo = thenum.match(fn)
if mo: return int(mo.group(1))
allnames = os.listdir('.')
allnames.sort(key=bynumber)
Jetzt haben Sie die Dateien in der Reihenfolge, die Sie wollen und können Loop
for i, fn in enumerate(allnames):
...
mit der fortlaufenden Nummer i
(die 0 sein wird, 1, 2, ...) aufgefüllt, wie Sie in den Ziel-Namen mögen.
Es gibt drei Schritte. Die erste ist immer alle Dateinamen. Die zweite ist die Umwandlung der Dateinamen. Die dritte ist die Umbenennung sie.
Wenn alle Dateien im selben Ordner befinden, dann soll glob arbeiten.
import glob
filenames = glob.glob("/path/to/folder/*.txt")
Als nächstes wollen Sie den Namen der Datei ändern. Sie können mit Polsterung drucken, dies zu tun.
>>> filename = "file-338.txt"
>>> import os
>>> fnpart = os.path.splitext(filename)[0]
>>> fnpart
'file-338'
>>> _, num = fnpart.split("-")
>>> num.rjust(5, "0")
'00338'
>>> newname = "file-%s.txt" % num.rjust(5, "0")
>>> newname
'file-00338.txt'
Nun müssen Sie sie alle benennen. os.rename
genau das tut.
os.rename(filename, newname)
Um es zusammen:
for filename in glob.glob("/path/to/folder/*.txt"): # loop through each file
newname = make_new_filename(filename) # create a function that does step 2, above
os.rename(filename, newname)
Warum Sie es in einem zweistufigen Verfahren nicht tun. Parse alle Dateien und benennen Sie mit gepolstertem Zahlen und dann ein anderes Skript ausführen, das diese Dateien erfolgt, die jetzt richtig sortiert werden, und benennt sie so dass sie zusammenhängend?
1) Nehmen Sie die Zahl im Dateinamen. 2) Links Pad mit Nullen 3) Speicher Namen.
def renamer():
for iname in os.listdir('.'):
first, second = iname.replace(" ", "").split("-")
number, ext = second.split('.')
first, number, ext = first.strip(), number.strip(), ext.strip()
number = '0'*(6-len(number)) + number # pad the number to be 7 digits long
oname = first + "-" + number + '.' + ext
os.rename(iname, oname)
print "Done"
Hope, das hilft