批量重命名目录中的文件

时间:2008-10-22 13:33:23

标签: python file-io rename batch-rename

是否有一种简单的方法可以使用Python重命名目录中已包含的一组文件?

示例:我有一个充满* .doc文件的目录,我想以一致的方式重命名它们。

  

X.doc - > “新(X)的.doc”

     

Y.doc - > “新(Y)的.doc”

13 个答案:

答案 0 :(得分:120)

我更喜欢为我必须做的每次替换编写小的一个衬里,而不是制作更通用和复杂的代码。 E.g:

这将替换当前目录

中任何非隐藏文件中带有连字符的所有下划线
import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]

答案 1 :(得分:101)

这种重命名非常简单,例如使用osglob模块:

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文件转换为new(%s).doc,其中%s是文件的先前基本名称(不带扩展名)。

答案 2 :(得分:21)

如果您不介意使用正则表达式,那么此函数将为您提供重命名文件的强大功能:

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

等等。

答案 3 :(得分:11)

我有这个简单地重命名文件夹

的子文件夹中的所有文件
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)))

我用new_str替换所有出现的old_str。

答案 4 :(得分:6)

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

  

我喜欢听音乐,电影和电影   图片文件以某种方式命名。   当我从中下载文件时   互联网,他们通常不跟随我   命名惯例。我寻找到了自我   手动重命名每个文件以适合我的   样式。这很快就老了,所以我   决定写一个程序去做   对我来说。

     

此程序可以转换文件名   全部小写,替换字符串   任何你想要的文件名,   从中修剪任意数量的字符   文件名的前面或后面。

该程序的源代码也可用。

答案 5 :(得分:6)

我自己编写了一个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 :(得分:2)

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 

答案 7 :(得分:2)

我遇到了类似的问题,但是我想将文本附加到目录中所有文件的文件名的开头并使用类似的方法。见下面的例子:

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

答案 8 :(得分:2)

  

位于您需要执行重命名的目录中。

SELECT LEFT(LEFT(email, strpos(email, '@') - 1), 12)
  || (CASE WHEN seqnum > 1 THEN (seqnum-1)::TEXT ELSE '' END)
  FROM (
    SELECT
      users.*,
      row_number() OVER (
        PARTITION BY LEFT(LEFT(email, strpos(email, '@') - 1), 12)
        ORDER BY id
      ) AS seqnum
    FROM users
  ) as u;

答案 9 :(得分:1)

对于我在我的目录中我有多个子目录,每个子目录有很多图像我想将所有子目录图像更改为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自己的回答)https://stackoverflow.com/a/45734381/6329006

答案 10 :(得分:1)

#  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

答案 11 :(得分:0)

此代码将起作用

该函数正好使用两个参数f_patth作为重命名文件的路径,并使用new_name作为文件的新名称。

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

答案 12 :(得分:0)

如果要在编辑器(例如vim)中修改文件名,click库带有命令click.edit(),该命令可用于接收来自编辑器的用户输入。这是如何使用它重构目录中文件的示例。

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

我编写了一个使用相同技术的命令行应用程序,但它减少了此脚本的易变性,并提供了更多选项,例如递归重构。这是指向github page的链接。如果您喜欢命令行应用程序,并且有兴趣对文件名进行一些快速编辑,这将很有用。 (我的应用程序类似于在ranger中找到的“ bulkrename”命令)。