Пакет Python-да файл атауын файл атауының алдында және кейін жолды немесе реттік нөмірді қосу арқылы өзгертеді

Іскерлік

OS модулі мен глоб модулін пайдаланып атауды жаппай өзгертіңіз.

Файл атауларынан бұрын және кейін жолдарды немесе реттік сандарды қосу арқылы қалтадағы файл атауларын жаппай өзгерту және атын өзгерту үшін os модулін және 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

OS модулінің 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() әдісін пайдаланыңыз.

str.format(args,*кваргс)
Жолды пішімдеу операцияларын орындайды. Бұл әдісті шақыратын жолда қалыпты таңбалар немесе {} арқылы бөлінген ауыстыру өрістері болуы мүмкін.Built-in Types — Python 3.10.0 Documentation

Пішім спецификация жолдарының синтаксисі
Пішімдеу жолында бұйра жақшаға алынған {} «алмастыру өрісі» бар.

Ауыстыру өрісінің синтаксисі келесідей:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Қарапайым тілмен айтқанда, ауыстыру өрісі өріс_атаудан басталады, бұл көрсетілген нысанның мәнін пішімдеуге және ауыстыру өрісінің орнына шығысқа кірістіруге әкеледі. Өріс_атаудан кейін түрлендіру өрісінен кейін ‘! Өріс_атаудан кейін түрлендіру өрісінен кейін ‘! 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 операторын келесідей етіп өзгертіңіз: сандарды 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

Файлдан кейін жолды/реттік нөмірді қосу кодының мысалы

Файлды кеңейтім мен түбір жолына бөлу үшін 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
Copied title and URL