ဖိုင်အမည်၏ ရှေ့နှင့်နောက်တွင် စာကြောင်း သို့မဟုတ် နံပါတ်စဉ်တစ်ခုကို ပေါင်းထည့်ခြင်းဖြင့် Python တွင် ဖိုင်အမည်ကို အသုတ်ပြောင်းပါ။

စီးပွားရေးလုပ်ငန်း

os module နှင့် glob module ကိုအသုံးပြု၍ အစုလိုက်အမည်ပြောင်းပါ။

ဖိုင်အမည်များ ရှေ့နှင့်နောက်တွင် မျဉ်းကြောင်းများ သို့မဟုတ် နံပါတ်များကို ပေါင်းထည့်ခြင်းဖြင့် ဖိုင်အမည်များ သို့မဟုတ် ဆက်တိုက်နံပါတ်များကို ပေါင်းထည့်ခြင်းဖြင့် ဖိုင်အမည်များကို ပြောင်းလဲရန်နှင့် အမည်ပြောင်းရန် os module နှင့် glob module ကို အသုံးပြုပါ။

နမူနာဖိုင်တည်ဆောက်ပုံ

အောက်ပါဖိုင်တည်ဆောက်ပုံကို နမူနာအဖြစ် ယူပါ။ ဤကိစ္စတွင်၊ ဖိုဒါတွင် ဖိုင်များ (ဖိုင်တွဲများမရှိ) သာရှိသည်ဟု ယူဆရသည်။

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

မှတ်သားထားရမည့်အရာများ

လုပ်ငန်းစဉ်တွင် ဖိုင်ကို အမည်ပြောင်းခြင်း ပါဝင်သောကြောင့်၊ မအောင်မြင်ပါက သိမ်းဆည်းနိုင်စေရန် မူရင်းဖိုင်ကို သီးခြားစီသိမ်းဆည်းပါ။

glob module ဖြင့် ဖိုင်စာရင်းကို ရယူပါ။

glob module သည် 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 အစား၊ argument path ကိုထည့်သွင်းခြင်းဖြင့် အောက်ပါတို့ကို သင်ရနိုင်သည်။
./testdir/a.jpg

အောက်တွင်ဖော်ပြထားသည့်အတိုင်း သီးခြား extensions များသာရရှိရန် ခရင်မ်ကတ်များ (*) ကို အသုံးပြုနိုင်သည်။
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 module ၏ function rename() ကို အသုံးပြုပါ။

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

ထို့နောက် a.jpg ကို a_000.jpg ဟု အမည်ပြောင်းပါမည်။

str.format() ဖြင့် သုညမပြည့်သော နံပါတ်များကို ထုတ်ပေးနေသည်

ဥပမာအားဖြင့်၊ ဖိုင်ဒါဇင်များစွာတွင် ဆက်တိုက်နံပါတ်များကို ထည့်သောအခါ၊ ကျွန်ုပ်တို့သည် “ 0” သို့မဟုတ် “ 1” အစား “ 00” သို့မဟုတ် “ 11” ကို အသုံးပြုလိုပါသည်။ ဤနည်းဖြင့် သုညများကို ဖြည့်လိုပါက str.format() method ကို အသုံးပြုပါ။

str.format(args,*kwargs)
string formatting လုပ်ဆောင်ချက်များကို လုပ်ဆောင်သည်။ ဤနည်းလမ်းကို ခေါ်ဆိုသည့် စာကြောင်းတွင် {} ဖြင့် ပိုင်းခြားထားသော ပုံမှန်အက္ခရာများ သို့မဟုတ် အစားထိုးအကွက်များ ပါဝင်နိုင်သည်။Built-in Types — Python 3.10.0 Documentation

ဖော်မတ်သတ်မှတ်ချက် စာကြောင်းများ၏ အထားအသို
ဖော်မတ်ချသည့်စာကြောင်းတွင် အကောက်ကောက်ကွင်းများ {} တွင် ထည့်သွင်းထားသော “ အစားထိုးအကွက်” ပါရှိသည်။

အစားထိုးအကွက်၏ syntax မှာ အောက်ပါအတိုင်းဖြစ်သည်။
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

ရိုးရှင်းသောအသုံးအနှုန်းဖြင့်၊ အစားထိုးအကွက်သည် field_name ဖြင့်စတင်သည်၊ ၎င်းသည် သတ်မှတ်ထားသည့်အရာဝတ္ထု၏တန်ဖိုးကို ဖော်မတ်လုပ်ပြီး အစားထိုးအကွက်အစား အထွက်ထဲသို့ ထည့်သွင်းစေသည်။ field_name ပြီးနောက်၊ ပြောင်းလဲခြင်းအကွက်ကို အာမေဋိတ်အမှတ်အသား ‘! field_name ပြီးနောက်၊ ပြောင်းလဲခြင်းအကွက်ကို အာမေဋိတ်အမှတ်အသား ‘! format_spec ကို အဆုံးတွင် colon ‘:’ ဖြင့်ရေးနိုင်သည်။ ၎င်းသည် အစားထိုးရမည့် တန်ဖိုး၏ ပုံသေမဟုတ်သော ဖော်မတ်ကို သတ်မှတ်သည်။
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

ဖိုင်တစ်ခုရှေ့တွင် string/sequential number တစ်ခုထည့်ရန် ကုဒ်နမူနာ

ပထမဦးစွာ 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 statement ကို ဤကဲ့သို့သောအရာသို့ပြောင်းပါ- 0 မှအစဉ်လိုက်ရေတွက်ထားသောနံပါတ်များကိုရယူရန် enumerate()။ ဤကိစ္စတွင်၊ နံပါတ်သည် ဂဏန်းသုံးလုံးဖြင့်ဖြည့်ပါသည်။

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

0 အစား 1 ဖြင့် စတင်လိုပါက စာရင်းပေးသွင်းခြင်း၏ ဒုတိယ အကြောင်းပြချက်ကို 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

ဖိုင်တစ်ခုပြီးနောက် string/sequential number ထည့်ရန် ကုဒ်နမူနာ

ဖိုင်ကို တိုးချဲ့မှုနှင့် အမြစ်လမ်းကြောင်းအဖြစ် ပိုင်းခြားရန် os.path.spltext() ကိုသုံးပါ၊ ထို့နောက် အမြစ်လမ်းကြောင်းတွင် စာကြောင်းများ သို့မဟုတ် နံပါတ်စဉ်များကို ထည့်ပါ။ အောက်ပါဥပမာတွင်၊ _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

ဖိုင်တစ်ခုရှေ့တွင် string/sequential number ပေါင်းထည့်သကဲ့သို့၊ sequential number တစ်ခုထည့်သောအခါ for statement ကိုပြောင်းပါ။

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