Thay đổi hàng loạt tên tệp trong Python bằng cách thêm một chuỗi hoặc số tuần tự trước và sau tên tệp

Kinh doanh

Đổi tên hàng loạt bằng cách sử dụng mô-đun os và mô-đun cầu.

Sử dụng mô-đun hệ điều hành và mô-đun toàn cầu để thay đổi và đổi tên hàng loạt tên tệp trong một thư mục bằng cách thêm chuỗi hoặc số thứ tự trước và sau tên tệp.

Cấu trúc tệp mẫu

Lấy cấu trúc tệp sau đây làm ví dụ. Trong trường hợp này, giả định rằng chỉ có các tệp (không có thư mục) trong thư mục.

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

Những điều cần lưu ý

Vì quá trình này liên quan đến việc đổi tên tệp, hãy lưu riêng tệp gốc để có thể lưu trong trường hợp bị lỗi.

Nhận danh sách tệp với mô-đun cầu

Mô-đun cầu sẽ tìm tất cả các tên đường dẫn phù hợp với mẫu được chỉ định theo các quy tắc được sử dụng bởi Unix shell.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Ví dụ, hàm sau có thể được sử dụng để lấy danh sách tên tệp và thư mục trong thư mục hiện tại.
glob.glob('./*')
Đối số có thể là một đường dẫn tuyệt đối hoặc một đường dẫn tương đối.

Trong ví dụ này, nó sẽ giống như sau.

import glob

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

Thay vì a.jpg, bạn có thể nhận được như sau, với đường dẫn đối số được thêm vào.
./testdir/a.jpg

Bạn cũng có thể sử dụng các ký tự đại diện (*) để chỉ nhận các phần mở rộng cụ thể, như được hiển thị bên dưới.
glob.glob('./testdir/*.jpg')

Có thể sử dụng kết hợp mẫu sau đây.

  • *: Khớp mọi thứ.
  • ?Khớp với bất kỳ ký tự đơn nào.
  • [abc]: Khớp một ký tự từ a, b hoặc c.
  • [!abc]: Khớp một ký tự không phải a, b hoặc c

Đổi tên bằng os.rename ()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Đổi tên tệp hoặc thư mục src thành dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Sử dụng chức năng rename () của mô-đun hệ điều hành, sẽ đổi tên nó như tên gợi ý.

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

Sau đó, a.jpg sẽ được đổi tên thành a_000.jpg.

Tạo các số tuần tự không điền bằng str.format ()

Ví dụ, khi thêm số thứ tự vào hàng chục tệp, chúng ta muốn sử dụng “00” hoặc “11” thay vì “0” hoặc “1”. Nếu bạn muốn điền các số không theo cách này, hãy sử dụng phương thức str.format ().

str.format(args,* kwargs)
Thực hiện các thao tác định dạng chuỗi. Chuỗi gọi phương thức này có thể chứa các ký tự bình thường hoặc các trường thay thế được phân tách bằng dấu {}.Built-in Types — Python 3.10.0 Documentation

Cú pháp của chuỗi đặc tả định dạng
Chuỗi định dạng chứa “trường thay thế” được đặt trong dấu ngoặc nhọn {}.

Cú pháp của trường thay thế như sau:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Nói một cách đơn giản hơn, trường thay thế bắt đầu bằng field_name, khiến giá trị của đối tượng được chỉ định được định dạng và chèn vào đầu ra thay vì trường thay thế. Sau field_name, trường chuyển đổi có thể được theo sau bởi một dấu chấm than ‘! Sau field_name, trường chuyển đổi có thể được theo sau bởi một dấu chấm than ‘! Định dạng_spec có thể được viết bằng dấu hai chấm ‘:’ ở cuối. Điều này chỉ định định dạng không mặc định của giá trị sẽ được thay thế.
string — Common string operations — Python 3.10.0 Documentation

Nếu bạn muốn điền nó bằng 0 ngay bây giờ, hãy làm như sau.

# 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

Ví dụ về mã để thêm chuỗi / số tuần tự trước tệp

Đầu tiên, lấy tên tệp bằng os.path.basename (). Sau đó, thêm một chuỗi hoặc số thứ tự vào trước tên tệp và nối nó với đường dẫn ban đầu bằng os.path.join ().

Ví dụ sau thêm img_ vào phía trước của tất cả các tên tệp.

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

Kết quả là như sau.

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

Nếu bạn muốn thêm các số liên tiếp, hãy thay đổi câu lệnh for thành như sau: enumerate () để nhận các số được đếm theo thứ tự từ 0. Trong trường hợp này, số được điền bằng ba chữ số.

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

Đây là kết quả.

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

Nếu bạn muốn bắt đầu bằng 1 thay vì 0, hãy đặt đối số thứ hai của liệt kê thành 1.

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

Nó diễn ra như thế này.

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

Ví dụ về mã để thêm một chuỗi / số tuần tự sau một tệp

Sử dụng os.path.splitext () để chia tệp thành phần mở rộng và đường dẫn gốc, sau đó thêm chuỗi hoặc số tuần tự vào đường dẫn gốc. Trong ví dụ sau, _img được thêm vào sau tất cả các tên tệp.

import os
import glob

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

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

Kết quả là đây.

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

Giống như khi thêm chuỗi / số tuần tự trước tệp, hãy thay đổi câu lệnh for khi thêm số tuần tự.

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
Copied title and URL