Пакетное переименование файлов в каталоге - PullRequest
92 голосов
/ 22 октября 2008

Есть ли простой способ переименовать группу файлов, уже содержащихся в каталоге, используя Python?

Пример: У меня есть каталог, полный * .doc файлов, и я хочу переименовать их согласованным образом.

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

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

Ответы [ 12 ]

121 голосов
/ 27 октября 2011

Я предпочитаю писать маленькие строки для каждой замены, которую мне нужно сделать, вместо того, чтобы делать более общий и сложный код. E.g.:

При этом все подчеркивания заменяются дефисами в любом не скрытом файле в текущем каталоге

import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
101 голосов
/ 22 октября 2008

Такое переименование довольно просто, например, с модулями os и 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))

Затем вы можете использовать его в своем примере следующим образом:

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

Приведенный выше пример преобразует все *.doc файлы в c:\temp\xx dir в new(%s).doc, где %s - предыдущее базовое имя файла (без расширения).

21 голосов
/ 22 октября 2008

Если вы не возражаете против использования регулярных выражений, то эта функция даст вам много возможностей в переименовании файлов:

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

Итак, в вашем примере вы могли бы сделать (при условии, что это текущий каталог, в котором находятся файлы):

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

но вы также можете вернуться к исходным именам файлов:

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

и более.

11 голосов
/ 04 декабря 2013

У меня есть это, чтобы просто переименовать все файлы в подпапках папки

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

Я заменяю все вхождения old_str любым случаем на new_str.

6 голосов
/ 15 апреля 2012

Я написал скрипт на Python самостоятельно. В качестве аргументов он принимает путь к каталогу, в котором находятся файлы, и шаблон именования, который вы хотите использовать. Однако он переименовывается путем добавления добавочного номера (1, 2, 3 и т. Д.) К указанному вами шаблону имен.

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

Надеюсь, это работает для вас.

6 голосов
/ 22 октября 2008

Попробуйте: http://www.mattweber.org/2007/03/04/python-script-renamepy/

Мне нравится иметь свою музыку, кино и файлы изображений названы определенным образом. Когда я загружаю файлы с Интернет, они обычно не следуют за мной соглашение об именовании. Я нашел себя вручную переименовывая каждый файл в соответствии с моим стиль. Это стало очень быстро, поэтому я решил написать программу для этого для меня.

Эта программа может конвертировать имя файла в нижнем регистре заменить строки в имя файла с тем, что вы хотите, и обрезать любое количество символов из передняя или задняя часть имени файла.

Исходный код программы также доступен.

2 голосов
/ 04 сентября 2018

Находитесь в каталоге, где необходимо выполнить переименование.

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 голосов
/ 19 октября 2017

У меня была похожая проблема, но я хотел добавить текст в начало имени файла для всех файлов в каталоге и использовал аналогичный метод. Смотрите пример ниже:

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 голосов
/ 30 апреля 2017
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 
1 голос
/ 02 апреля 2018
#  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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...