是否有一種簡單的方法可以使用Python重命名目錄中已包含的一組文件?對目錄中的文件進行批量重命名
例如:我有一個充滿* .doc文件的目錄,我想以一致的方式重命名它們。
X.doc - > 「新的(X).DOC」
Y.doc - > 「新的(Y).DOC」
是否有一種簡單的方法可以使用Python重命名目錄中已包含的一組文件?對目錄中的文件進行批量重命名
例如:我有一個充滿* .doc文件的目錄,我想以一致的方式重命名它們。
X.doc - > 「新的(X).DOC」
Y.doc - > 「新的(Y).DOC」
嘗試:http://www.mattweber.org/2007/03/04/python-script-renamepy/
我喜歡讓我的音樂,電影和 圖片文件以某種方式命名。 當我從 互聯網下載文件時,他們通常不遵循我的 命名約定。我發現自己 手動重命名每個文件以適應我的 風格。這老得很快,所以我 決定寫一個程序來爲我做 。
該程序可以將文件名 轉換爲全部小寫,在 替換字符串任何你想要的, 的文件名,並從 正面或文件名回修整任意數目的字符。
該程序的源代碼也可用。
你救了我,謝謝你。 – 2015-07-09 12:29:18
不幸的是,鏈接被破壞,有誰知道源代碼在哪裏? – ryanpcmcquen 2016-12-20 16:45:05
如果你不介意使用正則表達式,那麼這個功能會給你的權力在重命名文件:
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")
以及更多。
我更喜歡爲每次替換寫一個小的襯墊,而不是製作更通用和更復雜的代碼。例如。:
這將替換所有當前目錄
import os
[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]
我寫我自己的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
希望這對你有效。
我有這樣簡單地重命名文件夾
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出現的所有子文件夾中的所有文件。
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.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
我有一個類似的問題,但我想附加文本到目錄中所有文件的文件名的開頭,並使用類似的方法。看下面的例子:
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]))
命令`os.path.join(dir,titlePattern%title + ext)`中使用的`%`符號如何?我知道`%`是模數運算,也可以用作格式化運算符。但通常後面跟着`s`或`f`來指定格式。爲什麼在命令中的`%`之後沒有任何東西(空格)? – 2014-04-05 22:32:40
@ShashankSawant它確實是一個格式化運算符。有關文檔和示例用法,請參見[字符串格式化操作](https://docs.python.org/2/library/stdtypes.html#string-formatting)。 – DzinX 2014-04-07 08:50:33