Automation

เปลี่ยนชื่อไฟล์ทีละเยอะๆ ด้วย Python

บางครั้งเราจำเป็นต้องเปลี่ยนชื่อไฟล์ทีละมากๆ ถ้าไฟล์มีหลักสิบก็ ok แต่ถ้าเป็นหลักร้อยขึ้นไป รับรองว่าตาเหลือกแน่นอนครับ

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

ปล.บทความนี้ ใช้ Windows OS นะจ๊ะ

เปลี่ยนชื่อแค่ไฟล์เดียว

import os

old_file_name = r"documents\abc.pdf"
new_file_name = r"documents\xyz.pdf"

os.rename(old_file_name, new_file_name)
  • Line 1 : นำเข้า module ที่ชื่อว่า os เพื่อช่วยในการจัดการไฟล์
  • Line 3-4 : ตั้งชื่อตัวแปรให้กับไฟล์เก่าและใหม่
    • ใส่ r ข้างหน้า file path เพื่อเป็นการบอกว่าไม่ต้องใช้ escape character เช่น \n เป็นการขึ้นบรรทัดใหม่ \t คือ tab
    • ถ้าไม่ใช้ r สามารถใช้ \\ ได้เช่นกัน
    • ถ้าไม่ใส่ทั้ง r หรือ \\ จะขึ้น error ว่า (unicode error) ?unicodeescape? codec can?t decode bytes in position 2-3: truncated \UXXXXXXXX escape
  • Line 6 : เรียกใช้ method rename เพื่อเปลี่ยนชื่อไฟล์
    • old_file_name คือชื่อไฟล์เก่า
    • new_file_name คือชื่อไฟล์ใหม่

Note: os ย่อมาจาก operating system ซึ่งเป็น module ที่ใช้ในการจัดการ file system ที่ระบบปฏิบัติการ

เปลี่ยนชื่อมากกว่า 1 ไฟล์ ในโฟลเดอร์

กรณีนี้จะมีไฟล์ pdf ในโฟลเดอร์ที่ชื่อว่า documents ซึ่งผลที่ได้จากการประมวลผลคำสั่ง คือ

import os

for count, filename in enumerate(os.listdir("documents")):
    dist = "NewFile-" + str(count) + ".pdf"
    os.rename('documents/' + filename, 'documents/' + dist)
  • Line 3 : ใช้ Loop for เพื่อวนดึงไฟล์ทั้งหมดในโฟลเดอร์มาประมวลผล
    • enumerate คือ method ของ python ที่จะ return ตำแหน่งใน tuple และค่า ออกมา โดยจะเริ่มจากเลข 0 และค่าที่เก็บตัวเลขคือตัวแปร count
    • listdir เป็น method ที่จะ return ชื่อของทุกอย่างที่อยู่ในโฟลเดอร์ที่ระบุ
  • Line 4 : กำหนดชื่อไฟล์ใหม่

เปลี่ยนชื่อมากกว่า 1 ไฟล์ และใช้ชื่อบางส่วนจากไฟล์เดิม

ตัวอย่างผลลัพธ์

Note: ขอบเขตของการแก้ไขชื่อไฟล์ในลักษณะนี้คือ ชื่อไฟล์ต้องมีรูปแบบที่เหมือนกันหมด อาจจะเป็นคั่นด้วยขีดกลาง(-) จำนวน 1 ตัว เช่น license-1234.pdf

import os

os.chdir('documents')

for file in os.listdir():
    f_name, f_ext = os.path.splitext(file)
    f_title, f_code = f_name.split('-')

    f_title = f_title.strip()
    f_code = f_code.strip()

    new_name = '{}_{}{}'.format(f_code, 'code', f_ext)
    os.rename(file, new_name)
  • Line 3 : os.chdir คือ method ที่ใช้เปลี่ยน directory ที่กำลังทำงานอยู่ ณ ขณะนี้
  • Line 6 : แยกชื่อไฟล์และนามกุลไฟล์ออกจากกัน
  • Line 7 : แยกชื่อไฟล์ออกจากกันด้วยขีดกลาง (-)
  • Line 9-10 : ตัดช่องว่างออกจากชื่อไฟล์
  • Line 12 : สร้างชื่อไฟล์ใหม่ โดยใช้ method format() ในการกำหนดรูปแบบใหม่

ขอบคุณบทความจาก

Tags

2 Replies to เปลี่ยนชื่อไฟล์ทีละเยอะๆ ด้วย Python

  1. รบกวนสอบถามครับว่า สมุตว่าเรามีไฟล์ DCF_20230421_025-112728189-4-3_20230421210451244.pdf
    แต่จะตัดไฟล์เฉพาะบางส่วน เช่น ให้เหลือเพียง 20230421-112728189-4-3.pdf และจำนวนไฟล์เยอะ ต้องเขียน python ในรูปแบบไหนครับ ขอบคุณครับ

    1. ลองแบบนี้ก็ได้ครับ
      อ่านไฟล์ pdf ใน directory และ loop
      (ภายใน loop)
      1.replace _ (underscore) เป็น – (dash)
      2.(จากข้อ 2) split จาก – (dash) แล้วสร้างตัวแปร
      3.นำตัวแปรที่ถูก split มา reformat ในรูปแบบใหม่ที่ต้องการ และเปลี่ยนชื่อ
      ลองดูครับ

Leave a Reply

Your email address will not be published. Required fields are marked *