แบทช์เปลี่ยนชื่อไฟล์ใน Python โดยการเพิ่มสตริงหรือหมายเลขลำดับก่อนและหลังชื่อไฟล์

ธุรกิจ

เปลี่ยนชื่อเป็นกลุ่มโดยใช้โมดูลระบบปฏิบัติการและโมดูล glob

ใช้โมดูลระบบปฏิบัติการและโมดูล glob เพื่อเปลี่ยนและเปลี่ยนชื่อไฟล์ในโฟลเดอร์เป็นกลุ่มโดยเพิ่มสตริงหรือหมายเลขตามลำดับก่อนและหลังชื่อไฟล์

โครงสร้างไฟล์ตัวอย่าง

ใช้โครงสร้างไฟล์ต่อไปนี้เป็นตัวอย่าง ในกรณีนี้จะถือว่ามีเพียงไฟล์ (ไม่มีโฟลเดอร์) ในโฟลเดอร์

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

สิ่งที่ควรทราบ

เนื่องจากกระบวนการเกี่ยวข้องกับการเปลี่ยนชื่อไฟล์ ให้บันทึกไฟล์ต้นฉบับแยกกันเพื่อให้สามารถบันทึกได้ในกรณีที่เกิดความล้มเหลว

รับรายการไฟล์ด้วยโมดูล glob

โมดูล glob จะค้นหาชื่อพาธทั้งหมดที่ตรงกับรูปแบบที่ระบุตามกฎที่ใช้โดยเชลล์ Unix
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

ใช้ฟังก์ชัน rename() ของโมดูล os ซึ่งจะเปลี่ยนชื่อตามชื่อที่แนะนำ

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 ให้ตั้งค่าอาร์กิวเมนต์ที่สองของการแจกแจงเป็น 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