Question

Existe-t-il un moyen simple de renommer un groupe de fichiers déjà contenus dans un répertoire en utilisant Python?

Exemple: J'ai un répertoire plein de fichiers * .doc et je souhaite les renommer de manière cohérente.

  

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

     

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

Était-ce utile?

La solution

Ce renommage est assez facile, par exemple avec os et glob modules:

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))

Vous pouvez ensuite l'utiliser dans votre exemple comme ceci:

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

L'exemple ci-dessus convertit tous les fichiers *. doc du répertoire c: \ temp \ xx en new (% s) .doc . , où % s est le nom de base précédent du fichier (sans extension).

Autres conseils

Je préfère écrire de petites doublures pour chaque remplacement que je dois faire au lieu de créer un code plus générique et complexe. Exemple:

Ceci remplace tous les traits de soulignement par des traits d'union dans tout fichier non caché du répertoire en cours

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

Si les expressions régulières ne vous dérangent pas, alors cette fonction vous donnera beaucoup de pouvoir pour renommer des fichiers:

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))

Donc, dans votre exemple, vous pourriez faire (en supposant que c'est le répertoire actuel où se trouvent les fichiers):

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

mais vous pouvez également revenir aux noms de fichiers initiaux:

<*>

et plus encore.

Je dois simplement renommer tous les fichiers des sous-dossiers du dossier

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)))

Je remplace toutes les occurrences de old_str par n'importe quel cas par new_str.

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

  

J'aime avoir ma musique, mon film et   fichiers d'image nommés d'une certaine manière.   Quand je télécharge des fichiers du   Internet, ils ne suivent généralement pas mes   convention de nommage. je me suis trouvé   renommer manuellement chaque fichier pour correspondre à mon   style. Cela a vieilli vraiment vite, alors je   a décidé d'écrire un programme pour le faire   pour moi.

     

Ce programme peut convertir le nom du fichier.   en minuscules, remplacez les chaînes par   le nom de fichier avec ce que vous voulez,   et couper un nombre quelconque de caractères de   le recto ou le verso du nom de fichier.

Le code source du programme est également disponible.

J'ai écrit un script python moi-même. Il prend comme arguments le chemin du répertoire dans lequel les fichiers sont présents et le modèle de dénomination que vous souhaitez utiliser. Cependant, il renomme en attachant un numéro incrémentiel (1, 2, 3, etc.) au modèle de dénomination que vous donnez.

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

J'espère que cela fonctionne pour vous.

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 

J'ai eu un problème similaire, mais je voulais ajouter du texte au début du nom de fichier de tous les fichiers d'un répertoire et j'ai utilisé une méthode similaire. Voir l'exemple ci-dessous:

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]))
  

Placez-vous dans le répertoire dans lequel vous devez renommer.

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

comme dans mon répertoire, j'ai plusieurs sous-répertoires, chaque sous-répertoire contient de nombreuses images. Je souhaite modifier toutes les images du sous-répertoire en 1.jpg ~ 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

(ma propre réponse) 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

Ce code fonctionnera

La fonction prend exactement deux arguments f_patth comme chemin pour renommer le fichier et new_name comme nouveau nom du fichier.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top