បាច់ផ្លាស់ប្តូរឈ្មោះឯកសារនៅក្នុង Python ដោយបន្ថែមខ្សែអក្សរ ឬលេខបន្តបន្ទាប់មុន និងក្រោយឈ្មោះឯកសារ

អាជីវកម្ម

ប្តូរឈ្មោះជាដុំដោយប្រើម៉ូឌុល os និង glob module ។

ប្រើម៉ូឌុល os និង glob module ដើម្បីផ្លាស់ប្តូរ និងប្តូរឈ្មោះឯកសារក្នុង folder ជាច្រើនដោយបន្ថែមខ្សែអក្សរ ឬលេខបន្តបន្ទាប់គ្នាមុន និងក្រោយឈ្មោះឯកសារ។

ឧទាហរណ៍រចនាសម្ព័ន្ធឯកសារ

យករចនាសម្ព័ន្ធឯកសារខាងក្រោមជាឧទាហរណ៍។ ក្នុងករណីនេះវាត្រូវបានសន្មត់ថាមានតែឯកសារ (គ្មានថត) នៅក្នុងថត។

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

អ្វីដែលត្រូវចងចាំ

ដោយសារដំណើរការពាក់ព័ន្ធនឹងការប្តូរឈ្មោះឯកសារ សូមរក្សាទុកឯកសារដើមដោយឡែកពីគ្នា ដើម្បីឱ្យវាត្រូវបានរក្សាទុកក្នុងករណីបរាជ័យ។

ទទួលបានបញ្ជីឯកសារជាមួយម៉ូឌុល glob

ម៉ូឌុល glob នឹងស្វែងរកឈ្មោះផ្លូវទាំងអស់ដែលត្រូវគ្នានឹងលំនាំដែលបានបញ្ជាក់ដោយយោងទៅតាមច្បាប់ដែលប្រើដោយសែលយូនីក។
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

ប្រើមុខងារប្តូរឈ្មោះ() នៃម៉ូឌុល 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 statement ទៅ​អ្វី​មួយ​ដូច​នេះ៖ 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 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