Pergunta

Existe uma maneira fácil para renomear um grupo de arquivos já contidos em um diretório, usando Python?

Exemplo:. Eu tenho um diretório cheio de arquivos .doc * e quero renomeá-los de forma consistente

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

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

Foi útil?

Solução

Tal renomeação é muito fácil, por exemplo, com OS e glob módulos:

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

Você poderia, então, usá-lo no seu exemplo como este:

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

O exemplo acima irá converter todos os arquivos *.doc no dir c:\temp\xx para new(%s).doc, onde %s é o nome da base anterior do arquivo (sem extensão).

Outras dicas

Eu prefiro escrever um forros pequenas para cada substituir eu tenho que fazer em vez de fazer um código mais genérica e complexa. Por exemplo:.

Isto substitui todos os sublinhados com hífens em qualquer arquivo não-oculto no diretório atual

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

Se você não se importa usando expressões regulares, então esta função lhe daria muito poder em renomear arquivos:

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

Assim, no seu exemplo, você poderia fazer (assumindo que é o diretório atual onde os arquivos são):

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

mas você poderia também reverter para os nomes de arquivos iniciais:

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

e muito mais.

Eu tenho isso para simplesmente mudar o nome de todos os arquivos em subpastas da pasta

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

Estou a substituir todas as ocorrências de old_str com qualquer caso por new_str.

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

Eu gosto de ter minha música, filme, e arquivos de imagem com o nome de uma certa maneira. Quando eu baixar arquivos da internet, eles geralmente não seguir o meu convenção de nomes. Eu me achei renomear manualmente cada arquivo para caber minha estilo. Este ficou velho realmente rápido, então eu decidiu escrever um programa para fazer isso para mim.

Este programa pode converter o nome do arquivo para todas as letras minúsculas, substitua cordas em o nome do arquivo com o que quiser, e aparar qualquer número de caracteres a partir de parte da frente ou de trás do nome de arquivo.

O código fonte do programa também está disponível.

Eu escrevi um script python no meu próprio. Ele toma como argumentos o caminho do diretório no qual os arquivos estão presentes e o padrão de nomenclatura que você deseja usar. No entanto, ele renomeia, anexando um número incremental (1, 2, 3 e assim por diante) para o padrão de nomenclatura que você dá.

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

Espero que isso funciona para você.

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 

Eu tive um problema semelhante, mas eu queria acrescentar texto ao início do nome de todos os arquivos em um diretório de arquivos e usou um método semelhante. Veja o exemplo abaixo:

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

Seja no diretório onde você precisa para realizar a mudança de nome.

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

como para mim em meu diretório Eu tenho múltiplos subdir, cada subdir tem muitas imagens que eu quero mudar todas as imagens o subdiretório para 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

(mys própria resposta) 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

Este código irá funcionar

A função tem exatamente dois argumentos f_patth como seu caminho para mudar o nome do arquivo e new_name como seu novo nome para o arquivo.

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top