Frage

Gibt es eine einfache Möglichkeit, eine Gruppe von Dateien, die bereits in einem Verzeichnis mit Python enthielten umbenennen?

Beispiel: Ich habe ein Verzeichnis voller * .doc-Dateien und ich möchte, dass sie in einer konsistenten Art und Weise umbenennen

.
  

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

     

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

War es hilfreich?

Lösung

Eine solche Umbenennung ist ganz einfach, zum Beispiel mit os und glob Module:

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 dann in Ihrem Beispiel wie folgt verwenden es:

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

Das obige Beispiel wird alle *.doc Dateien in c:\temp\xx dir konvertieren, new(%s).doc wo %s der vorherige Basisname der Datei ist (ohne Erweiterung).

Andere Tipps

Ich ziehe das Schreiben kleine Einzeiler für jeden ersetze ich zu tun habe, anstatt einen allgemeinere und komplexen Code zu machen. Z.

Dies ersetzt alle Unterstreicht mit Bindestrichen in jeder nicht-versteckten Datei im aktuellen Verzeichnis

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

Wenn Sie nicht mit regulären Ausdrücken nichts, dann ist diese Funktion würde Ihnen viel Macht gibt Dateien in dem 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))

Also in Ihrem Beispiel könnten Sie tun (vorausgesetzt, es ist das aktuelle Verzeichnis, in dem die Dateien):

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

aber man könnte auch zurück zu den ursprünglichen Dateinamen rollen:

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

und vieles mehr.

Ich muss das einfach alle Dateien in Unterordnern des Ordners umbenennen

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 bin alle Vorkommen von old_str mit jedem Fall durch new_str ersetzt wird.

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

  

Ich mag meine Musik, Film haben, und   Bilddateien eine bestimmte Art und Weise benannt.   Wenn ich Download von Dateien aus dem   Internet, sie folgen in der Regel nicht meine   Namenskonvention. Ich habe mich selbst gefunden   manuell umbenennen jede Datei meines passen   Stil. Dies bekam alt wirklich schnell, so dass ich   beschlossen, ein Programm zu schreiben, es zu tun   für mich.

     

Dieses Programm kann den Dateinamen umwandeln   zu klein schreiben, Ersetzen von Strings in   der Dateiname mit dem, was Sie wollen,   und schneiden eine beliebige Anzahl von Zeichen aus   die Vorder- oder Rückseite des Dateinamens.

Der Quellcode des Programms ist ebenfalls verfügbar.

Ich habe einen Python-Skript auf meinem eigenen geschrieben. Es nimmt als Argumente den Pfad des Verzeichnisses, in dem die Dateien vorhanden und das Namensmuster sind, die Sie verwenden möchten. Aber es umbenennt durch eine inkrementelle Nummer (1, 2, 3 usw.) auf das Namensmuster beilegen geben.

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

Hope das funktioniert für Sie.

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 

Ich hatte ein ähnliches Problem, aber ich wollte Text am Anfang des Dateinamens aller Dateien in einem Verzeichnis anhängen und verwendet ein ähnliches Verfahren. 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]))
  

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

als ich in meinem Verzeichnis ich mehrere subdir habe, jede subdir hat viele Bilder Ich möchte all subdir Bilder zu 1.jpg ändern ~ n.jpg

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

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

#  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

Dieser Code funktioniert

Die Funktion nimmt genau zwei Argumente f_patth als Pfaddatei und new_name als neuen Namen für die Datei umzubenennen.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top