通過在文件名前後添加字符串或序列號,在 Python 中批量更改文件名

商業

使用 os 模塊和 glob 模塊批量重命名。

使用 os 模塊和 glob 模塊通過在文件名前後添加字符串或序列號來批量更改和重命名文件夾中的文件名。

示例文件結構

以下面的文件結構為例。在這種情況下,假設文件夾中只有文件(沒有文件夾)。

.
└── testdir
    ├── a.jpg
    ├── b.jpg
    ├── c.jpg
    ├── d.jpg
    └── e.jpg

要記住的事情

由於該過程涉及重命名文件,因此請單獨保存原始文件,以便在失敗時保存。

使用 glob 模塊獲取文件列表

glob 模塊將根據 Unix shell 使用的規則查找與指定模式匹配的所有路徑名。
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

例如,以下函數可用於獲取當前目錄中的文件和目錄名稱列表。
glob.glob('./*')
參數可以是絕對路徑或相對路徑。

在這個例子中,它看起來像下面這樣。

import glob

print(glob.glob('./testdir/*'))
# => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']

您可以獲得以下內容而不是 a.jpg,並添加參數路徑。
./testdir/a.jpg

您還可以使用通配符 (*) 來僅獲取特定的擴展名,如下所示。
glob.glob('./testdir/*.jpg')

可以使用以下模式匹配。

  • *: 匹配一切。
  • ?匹配任何單個字符。
  • [abc]: 匹配 a、b 或 c 中的單個字符。
  • [!abc]: 匹配 a、b 或 c 以外的單個字符

使用 os.rename() 重命名

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
將文件或目錄 src 重命名為 dst。
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

使用 os 模塊的函數 rename() ,它會如名字所暗示的那樣對其進行重命名。

import os
os.rename('./testdir/a.jpg', './testdir/a_000.jpg')

然後,a.jpg 將重命名為 a_000.jpg。

使用 str.format() 生成零填充序列號

例如,在給幾十個文件添加序列號時,我們希望使用“00”或“11”而不是“0”或“1”。如果要以這種方式填充零,請使用 str.format() 方法。

str.format(args,*誇格)
執行字符串格式化操作。調用此方法的字符串可以包含由 {} 分隔的普通字符或替換字段。Built-in Types — Python 3.10.0 Documentation

格式規範字符串的語法
格式化字符串包含用大括號 {} 括起來的“替換字段”。

替換字段的語法如下:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

簡單來說,替換字段以 field_name 開頭,這會導致指定對象的值被格式化並插入到輸出中,而不是替換字段。在 field_name 之後,轉換字段可以跟一個感嘆號 ‘!在 field_name 之後,轉換字段可以跟一個感嘆號 ‘! format_spec 可以用冒號“:”結尾。這指定要替換的值的非默認格式。
string — Common string operations — Python 3.10.0 Documentation

如果你現在想用 0 填充它,請執行以下操作。

# 3を2桁でゼロ埋め
print('{0:02d}'.format(3))
# => 03

# Fill in the zeros with three and four digits for 4 and 6, respectively.
print('{0:03d}, {1:04d}'.format(4, 6))
# => 004, 0006

在文件前添加字符串/序列號的代碼示例

首先,使用 os.path.basename() 獲取文件名。然後,在文件名前添加一個字符串或序列號,並用 os.path.join() 將其與原始路徑連接起來。

以下示例將 img_ 添加到所有文件名的前面。

import os
import glob

path = "./testdir"
files = glob.glob(path + '/*')

for f in files:
    os.rename(f, os.path.join(path, 'img_' + os.path.basename(f)))

結果如下。

.
└── testdir
    ├── img_a.jpg
    ├── img_b.jpg
    ├── img_c.jpg
    ├── img_d.jpg
    └── img_e.jpg

如果要添加順序號,請將for 語句更改為如下所示: enumerate() 以獲取從0 開始按順序計數的數字。在這種情況下,數字填充為三位數字。

for i, f in enumerate(files):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

這是結果。

.
└── testdir
    ├── 000_a.jpg
    ├── 001_b.jpg
    ├── 002_c.jpg
    ├── 003_d.jpg
    └── 004_e.jpg

如果要從 1 而不是 0 開始,請將 enumerate 的第二個參數設置為 1。

for i, f in enumerate(files, 1):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

它是這樣的。

.
└── testdir
    ├── 001_a.jpg
    ├── 002_b.jpg
    ├── 003_c.jpg
    ├── 004_d.jpg
    └── 005_e.jpg

在文件後添加字符串/序列號的代碼示例

使用 os.path.splitext() 將文件拆分為擴展名和根路徑,然後在根路徑中添加字符串或序列號。在以下示例中,_img 被添加到所有文件名之後。

import os
import glob

files = glob.glob('./testdir/*')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

結果是這樣的。

.
└── testdir
    ├── a_img.jpg
    ├── b_img.jpg
    ├── c_img.jpg
    ├── d_img.jpg
    └── e_img.jpg

與在文件前添加字符串/序列號一樣,在添加序列號時更改 for 語句。

for i, f in enumerate(files):
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_' + '{0:03d}'.format(i) + fext)
.
└── testdir
    ├── a_000.jpg
    ├── b_001.jpg
    ├── c_002.jpg
    ├── d_003.jpg
    └── e_004.jpg