Batch-Umbenennung von Dateien in einem Verzeichnis

101

Gibt es eine einfache Möglichkeit, eine Gruppe von Dateien, die bereits in einem Verzeichnis enthalten sind, mit Python umzubenennen?

Beispiel: Ich habe ein Verzeichnis voller * .doc-Dateien und möchte diese auf konsistente Weise umbenennen.

X.doc -> "new (X) .doc"

Y.doc -> "neu (Y) .doc"

Nate
quelle

Antworten:

113

Ein solches Umbenennen ist beispielsweise mit OS- und Glob- Modulen recht einfach :

import glob, os

def rename(dir, pattern, titlePattern):
    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):
        title, ext = os.path.splitext(os.path.basename(pathAndFilename))
        os.rename(pathAndFilename, 
                  os.path.join(dir, titlePattern % title + ext))

Sie können es dann in Ihrem Beispiel folgendermaßen verwenden:

rename(r'c:\temp\xx', r'*.doc', r'new(%s)')

Im obigen Beispiel werden alle *.docDateien im c:\temp\xxVerzeichnis in konvertiert new(%s).doc, wobei %sder vorherige Basisname der Datei (ohne Erweiterung) angegeben ist.

DzinX
quelle
1
Wie wird das %Symbol im Befehl verwendet os.path.join(dir, titlePattern % title + ext)? Ich weiß, %ist für den Modulo-Betrieb und wird auch als Formatierungsoperator verwendet. In der Regel folgt jedoch das soder f, um das Format anzugeben. Warum ist nichts (Leerzeichen) unmittelbar danach %in dem genannten Befehl?
Shashank Sawant
3
@ShashankSawant Es ist in der Tat ein Formatierungsoperator. Siehe String Formatierungsfunktionen für Dokumentation und Beispielnutzung.
DzinX
132

Ich schreibe lieber kleine Einzeiler für jeden Ersatz, den ich machen muss, anstatt einen allgemeineren und komplexeren Code zu erstellen. Z.B:

Dies ersetzt alle Unterstriche durch Bindestriche in nicht versteckten Dateien im aktuellen Verzeichnis

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
Cesar Canassa
quelle
4
So viel einfacher als die anderen Methoden. Deshalb liebe ich Python.
Dan Gayle
Ich habe heute viel zu viel Zeit damit verschwendet, herauszufinden, warum mein Befehl "Umbenennen" nicht funktioniert hat - hätte zuerst hierher kommen sollen! Großartiger pythonischer Einzeiler!
Devin
Funktioniert nicht, da Windows die Dateien nacheinander in alphabetischer Reihenfolge neu anordnet rename
anordnet
4
Ausgezeichnet, aber es funktioniert nur mit einem Verzeichnis ohne Unterverzeichnis.
Hill
Wenn Sie no such file errornur daran denken, os.renamebrauchen Sie vollen Weg
Windsooon
22

Wenn es Ihnen nichts ausmacht, reguläre Ausdrücke zu verwenden, können Sie mit dieser Funktion Dateien umbenennen:

import re, glob, os

def renamer(files, pattern, replacement):
    for pathname in glob.glob(files):
        basename= os.path.basename(pathname)
        new_filename= re.sub(pattern, replacement, basename)
        if new_filename != basename:
            os.rename(
              pathname,
              os.path.join(os.path.dirname(pathname), new_filename))

In Ihrem Beispiel könnten Sie also Folgendes tun (vorausgesetzt, es ist das aktuelle Verzeichnis, in dem sich die Dateien befinden):

renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")

Sie können aber auch zu den ursprünglichen Dateinamen zurückkehren:

renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")

und mehr.

tzot
quelle
11

Ich habe dies, um einfach alle Dateien in Unterordnern des Ordners umzubenennen

import os

def replace(fpath, old_str, new_str):
    for path, subdirs, files in os.walk(fpath):
        for name in files:
            if(old_str.lower() in name.lower()):
                os.rename(os.path.join(path,name), os.path.join(path,
                                            name.lower().replace(old_str,new_str)))

Ich ersetze alle Vorkommen von old_str durch new_str.

kiriloff
quelle
Dieser Code dient wirklich zum Ersetzen eines Teils eines Titels einer Datei in einem Verzeichnis.
GeoJshaun
6

Versuchen Sie: http://www.mattweber.org/2007/03/04/python-script-renamepy/

Ich möchte, dass meine Musik-, Film- und Bilddateien auf eine bestimmte Weise benannt werden. Wenn ich Dateien aus dem Internet herunterlade, folgen sie normalerweise nicht meiner Namenskonvention. Ich habe jede Datei manuell umbenannt, um sie meinem Stil anzupassen. Das wurde sehr schnell alt, also beschloss ich, ein Programm zu schreiben, um es für mich zu tun.

Dieses Programm kann den Dateinamen in Kleinbuchstaben konvertieren, Zeichenfolgen im Dateinamen durch beliebige Zeichen ersetzen und eine beliebige Anzahl von Zeichen von der Vorder- oder Rückseite des Dateinamens abschneiden.

Der Quellcode des Programms ist ebenfalls verfügbar.

xsl
quelle
1
Leider ist der Link unterbrochen. Weiß jemand, wo sich der Quellcode befindet?
Ryanpcmcquen
6

Ich habe selbst ein Python-Skript geschrieben. Als Argumente werden der Pfad des Verzeichnisses verwendet, in dem sich die Dateien befinden, und das Namensmuster, das Sie verwenden möchten. Die Umbenennung erfolgt jedoch durch Anhängen einer inkrementellen Nummer (1, 2, 3 usw.) an das von Ihnen angegebene Namensmuster.

import os
import sys

# checking whether path and filename are given.
if len(sys.argv) != 3:
    print "Usage : python rename.py <path> <new_name.extension>"
    sys.exit()

# splitting name and extension.
name = sys.argv[2].split('.')
if len(name) < 2:
    name.append('')
else:
    name[1] = ".%s" %name[1]

# to name starting from 1 to number_of_files.
count = 1

# creating a new folder in which the renamed files will be stored.
s = "%s/pic_folder" % sys.argv[1]
try:
    os.mkdir(s)
except OSError:
    # if pic_folder is already present, use it.
    pass

try:
    for x in os.walk(sys.argv[1]):
        for y in x[2]:
            # creating the rename pattern.
            s = "%spic_folder/%s%s%s" %(x[0], name[0], count, name[1])
            # getting the original path of the file to be renamed.
            z = os.path.join(x[0],y)
            # renaming.
            os.rename(z, s)
            # incrementing the count.
            count = count + 1
except OSError:
    pass

Hoffe das funktioniert bei dir.

harisibrahimkv
quelle
5

Befinden Sie sich in dem Verzeichnis, in dem Sie die Umbenennung durchführen müssen.

import os
# get the file name list to nameList
nameList = os.listdir() 
#loop through the name and rename
for fileName in nameList:
    rename=fileName[15:28]
    os.rename(fileName,rename)
#example:
#input fileName bulk like :20180707131932_IMG_4304.JPG
#output renamed bulk like :IMG_4304.JPG
Ajay Chandran
quelle
um "im Verzeichnis zu sein ..." verwendenos.chdir(path_of_directory)
MagTun
2
directoryName = "Photographs"
filePath = os.path.abspath(directoryName)
filePathWithSlash = filePath + "\\"

for counter, filename in enumerate(os.listdir(directoryName)):

    filenameWithPath = os.path.join(filePathWithSlash, filename)

    os.rename(filenameWithPath, filenameWithPath.replace(filename,"DSC_" + \
          str(counter).zfill(4) + ".jpg" ))

# e.g. filename = "photo1.jpg", directory = "c:\users\Photographs"        
# The string.replace call swaps in the new filename into 
# the current filename within the filenameWitPath string. Which    
# is then used by os.rename to rename the file in place, using the  
# current (unmodified) filenameWithPath.

# os.listdir delivers the filename(s) from the directory
# however in attempting to "rename" the file using os 
# a specific location of the file to be renamed is required.

# this code is from Windows 
frank__aguirre
quelle
2

Ich hatte ein ähnliches Problem, wollte aber Text an den Anfang des Dateinamens aller Dateien in einem Verzeichnis anhängen und verwendete eine ähnliche Methode. Siehe Beispiel unten:

folder = r"R:\mystuff\GIS_Projects\Website\2017\PDF"

import os


for root, dirs, filenames in os.walk(folder):


for filename in filenames:  
    fullpath = os.path.join(root, filename)  
    filename_split = os.path.splitext(filename) # filename will be filename_split[0] and extension will be filename_split[1])
    print fullpath
    print filename_split[0]
    print filename_split[1]
    os.rename(os.path.join(root, filename), os.path.join(root, "NewText_2017_" + filename_split[0] + filename_split[1]))
Amber Davis
quelle
1

In meinem Verzeichnis habe ich mehrere Unterverzeichnisse. Jedes Unterverzeichnis enthält viele Bilder. Ich möchte alle Unterverzeichnisbilder in 1.jpg ~ n.jpg ändern

def batch_rename():
    base_dir = 'F:/ad_samples/test_samples/'
    sub_dir_list = glob.glob(base_dir + '*')
    # print sub_dir_list # like that ['F:/dir1', 'F:/dir2']
    for dir_item in sub_dir_list:
        files = glob.glob(dir_item + '/*.jpg')
        i = 0
        for f in files:
            os.rename(f, os.path.join(dir_item, str(i) + '.jpg'))
            i += 1

(meine eigene Antwort) https://stackoverflow.com/a/45734381/6329006

Jayhello
quelle
1
#  another regex version
#  usage example:
#  replacing an underscore in the filename with today's date
#  rename_files('..\\output', '(.*)(_)(.*\.CSV)', '\g<1>_20180402_\g<3>')
def rename_files(path, pattern, replacement):
    for filename in os.listdir(path):
        if re.search(pattern, filename):
            new_filename = re.sub(pattern, replacement, filename)
            new_fullname = os.path.join(path, new_filename)
            old_fullname = os.path.join(path, filename)
            os.rename(old_fullname, new_fullname)
            print('Renamed: ' + old_fullname + ' to ' + new_fullname
Dan
quelle
1

Wenn Sie Dateinamen in einem Editor (z. B. vim) ändern möchten, enthält die Klickbibliothek den Befehl click.edit(), mit dem Benutzereingaben von einem Editor empfangen werden können. Hier ist ein Beispiel dafür, wie Dateien in einem Verzeichnis umgestaltet werden können.

import click
from pathlib import Path

# current directory
direc_to_refactor = Path(".")

# list of old file paths
old_paths = list(direc_to_refactor.iterdir())

# list of old file names
old_names = [str(p.name) for p in old_paths]

# modify old file names in an editor,
# and store them in a list of new file names
new_names = click.edit("\n".join(old_names)).split("\n")

# refactor the old file names
for i in range(len(old_paths)):
    old_paths[i].replace(direc_to_refactor / new_names[i])

Ich habe eine Befehlszeilenanwendung geschrieben, die dieselbe Technik verwendet, aber die Volatilität dieses Skripts verringert und mehr Optionen bietet, z. B. rekursives Refactoring. Hier ist der Link zur Github-Seite . Dies ist nützlich, wenn Sie Befehlszeilenanwendungen mögen und schnell Änderungen an Dateinamen vornehmen möchten. (Meine Anwendung ähnelt dem Befehl "Massenname" in Ranger ).

Jim Shaddix
quelle
1
Wir empfehlen zwar Links zu externen Ressourcen, raten jedoch von Nur-Link-Antworten ab, da diese nach Ablauf des Links unbrauchbar werden. Bitte aktualisieren Sie Ihre Antwort, um die Antwort auf die Frage aufzunehmen :)
IT Delinquent
Absolut. Ich werde meinen Beitrag bearbeiten. Dies ist mein erster Beitrag, daher schätze ich die Anleitung!
Jim Shaddix
0

Dieser Code wird funktionieren

Die Funktion verwendet genau zwei Argumente f_patth als Pfad zum Umbenennen der Datei und new_name als neuen Namen für die Datei.

import glob2
import os


def rename(f_path, new_name):
    filelist = glob2.glob(f_path + "*.ma")
    count = 0
    for file in filelist:
        print("File Count : ", count)
        filename = os.path.split(file)
        print(filename)
        new_filename = f_path + new_name + str(count + 1) + ".ma"
        os.rename(f_path+filename[1], new_filename)
        print(new_filename)
        count = count + 1
murthy annavajhula
quelle