webentwicklung-frage-antwort-db.com.de

Stapelumbenennung von Dateien in einem Verzeichnis

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 mit * .doc-Dateien und möchte diese auf einheitliche Weise umbenennen.

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

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

86
Nate

Eine solche Umbenennung ist sehr einfach, beispielsweise mit den Modulen os und glob :

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önnten es dann in Ihrem Beispiel so verwenden:

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

Im obigen Beispiel werden alle *.doc-Dateien in c:\temp\xx dir in new(%s).doc konvertiert, wobei %s der vorherige Basisname der Datei (ohne Erweiterung) ist.

97
DzinX

Ich ziehe es vor, kleine Liners für jedes Ersetzen zu schreiben, anstatt einen generischeren und komplexeren Code zu erstellen. Z.B.:

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

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
113
Cesar Canassa

Wenn Sie nichts dagegen haben, reguläre Ausdrücke zu verwenden, können Sie mit dieser Funktion die 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 dies 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 auf die ursprünglichen Dateinamen zurückgreifen:

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

und mehr.

21
tzot

Ich habe hiermit einfach alle Dateien in Unterordnern des Ordners umbenannt

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 jeden Fall durch new_str.

11
octoback

Ich habe selbst ein Python-Skript geschrieben. Als Argumente werden der Pfad des Verzeichnisses, in dem sich die Dateien befinden, und das Benennungsmuster, das Sie verwenden möchten, als Argument verwendet. Es wird jedoch umbenannt, indem dem angegebenen Benennungsmuster eine inkrementelle Nummer (1, 2, 3 usw.) hinzugefügt wird.

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 für dich.

6
harisibrahimkv

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

Ich mag meine Musik, meinen Film und Bilddateien, die einen bestimmten Namen haben . Wenn ich Dateien aus der .__-Datei herunterlade. Internet folgen sie normalerweise nicht meinem Namenskonvention. Ich habe mich selbst gefunden Manuelles Umbenennen jeder Datei in meine Stil. Das wurde sehr schnell alt, so dass ich beschloss, ein Programm dafür zu schreiben für mich.

Dieses Programm kann den Dateinamen .__ konvertieren. Ersetzen Sie in Kleinbuchstaben die Zeichenfolgen in der Dateiname mit dem, was Sie möchten, und trimmen Sie eine beliebige Anzahl von Zeichen aus die Vorder- oder Rückseite des Dateinamens.

Der Quellcode des Programms ist ebenfalls verfügbar.

6
xsl

Seien Sie in dem Verzeichnis, in dem Sie die Umbenennung vornehmen 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
2
Ajay Chandran

Ich hatte ein ähnliches Problem, aber ich wollte Text an den Anfang des Dateinamens aller Dateien in einem Verzeichnis anhängen und verwandte 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]))
2
Amber Davis
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 
2
frank__aguirre

Wenn Sie Dateinamen in einem Editor (z. B. vim) ändern möchten, enthält die Bibliothek click den Befehl click.edit(), mit dem Benutzereingaben von einem Editor empfangen werden können. Hier ist ein Beispiel, wie Sie Dateien in einem Verzeichnis umgestalten 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, jedoch die Flüchtigkeit dieses Skripts verringert und über mehr Optionen verfügt, z. B. rekursives Refactoring. Hier ist der Link zur Github-Seite . Dies ist nützlich, wenn Sie Befehlszeilenanwendungen mögen und schnell Dateinamen bearbeiten möchten. (Meine Anwendung ähnelt dem Befehl "Bulkname" in Ranger ).

1
Jim Shaddix

ich habe in meinem Verzeichnis mehrere Unterverzeichnisse. Jedes Unterverzeichnis hat 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

1
Jayhello
#  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
1
Dan

Dieser Code wird funktionieren

Die Funktion verwendet genau zwei Argumente f_patth als Pfad zum Umbenennen der Datei und new_name als neuen Namen der 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
0