2008-10-22 38 views
76

是否有一種簡單的方法可以使用Python重命名目錄中已包含的一組文件?對目錄中的文件進行批量重命名

例如:我有一個充滿* .doc文件的目錄,我想以一致的方式重命名它們。

X.doc - > 「新的(X).DOC」

Y.doc - > 「新的(Y).DOC」

回答

90

這種改名是很容易的,例如與osglob模塊:

​​

然後,您可以使用它在你的例子是這樣的:

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

上面的例子將轉換所有*.doc文件在c:\temp\xx dir到new(%s).doc,其中%s是該文件的以前的基本名稱(沒有擴展名)。

+1

命令`os.path.join(dir,titlePattern%title + ext)`中使用的`%`符號如何?我知道`%`是模數運算,也可以用作格式化運算符。但通常後面跟着`s`或`f`來指定格式。爲什麼在命令中的`%`之後沒有任何東西(空格)? – 2014-04-05 22:32:40

+3

@ShashankSawant它確實是一個格式化運算符。有關文檔和示例用法,請參見[字符串格式化操作](https://docs.python.org/2/library/stdtypes.html#string-formatting)。 – DzinX 2014-04-07 08:50:33

6

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

我喜歡讓我的音樂,電影和 圖片文件以某種方式命名。 當我從 互聯網下載文件時,他們通常不遵循我的 命名約定。我發現自己 手動重命名每個文件以適應我的 風格。這老得很快,所以我 決定寫一個程序來爲我做 。

該程序可以將文件名 轉換爲全部小寫,在 替換字符串任何你想要的, 的文件名,並從 正面或文件名回修整任意數目的字符。

該程序的源代碼也可用。

+0

你救了我,謝謝你。 – 2015-07-09 12:29:18

+1

不幸的是,鏈接被破壞,有誰知道源代碼在哪裏? – ryanpcmcquen 2016-12-20 16:45:05

20

如果你不介意使用正則表達式,那麼這個功能會給你的權力在重命名文件:

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

以及更多。

93

我更喜歡爲每次替換寫一個小的襯墊,而不是製作更通用和更復雜的代碼。例如。:

這將替換所有當前目錄

import os 
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')] 
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 

希望這對你有效。

10

我有這樣簡單地重命名文件夾

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出現的所有子文件夾中的所有文件。

1
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 
0

爲我在我的目錄我有多個子目錄,子目錄每個都有大量的圖片我想所有的子目錄圖像更改爲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

1

我有一個類似的問題,但我想附加文本到目錄中所有文件的文件名的開頭,並使用類似的方法。看下面的例子:

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