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!

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top