Đổ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