Hópbreyttu skráarnafni í Python með því að bæta við streng eða raðnúmeri fyrir og á eftir skráarnafninu

Viðskipti

Endurnefna í lausu með því að nota OS-eininguna og glob-eininguna.

Notaðu OS-eininguna og glob-eininguna til að breyta og endurnefna skráarnöfnin í möppu í einu með því að bæta við strengjum eða raðnúmerum fyrir og á eftir skráarnöfnunum.

Dæmi um skráarskipulag

Taktu eftirfarandi skráarskipulag sem dæmi. Í þessu tilviki er gert ráð fyrir að það séu aðeins skrár (engar möppur) í möppunni.

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

Atriði sem þarf að hafa í huga

Þar sem ferlið felur í sér að endurnefna skrána skaltu vista upprunalegu skrána sérstaklega svo að hægt sé að vista hana ef bilun verður.

Fáðu skráalistann með glob-einingunni

Glob-einingin finnur öll slóðanöfn sem passa við tilgreint mynstur í samræmi við reglurnar sem Unix skelin notar.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Til dæmis er hægt að nota eftirfarandi aðgerð til að fá lista yfir skráar- og möppuheiti í núverandi möppu.
glob.glob('./*')
Rökin geta verið alger leið eða afstæð leið.

Í þessu dæmi myndi það líta svona út.

import glob

print(glob.glob('./testdir/*'))
# => ['./testdir/a.jpg', './testdir/b.jpg', './testdir/c.jpg', './testdir/d.jpg', './testdir/e.jpg']

Í staðinn fyrir a.jpg geturðu fengið eftirfarandi, með röksemdaleiðinni bætt við.
./testdir/a.jpg

Þú getur líka notað jokertákn (*) til að fá aðeins sérstakar viðbætur, eins og sýnt er hér að neðan.
glob.glob('./testdir/*.jpg')

Hægt er að nota eftirfarandi mynstursamsvörun.

  • *: Passar við allt.
  • ?Passar við hvaða staf sem er.
  • [abc]: Passar við einn staf úr a, b eða c.
  • [!abc]: Passar við einn staf annan en a, b eða c

Endurnefna með os.rename()

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Endurnefna skrána eða möppuna src í dst.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Notaðu aðgerðina rename() í OS-einingunni, sem mun endurnefna hana eins og nafnið gefur til kynna.

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

Síðan verður a.jpg breytt í a_000.jpg.

Búa til núllfylltar raðnúmer með str.format()

Til dæmis, þegar raðnúmerum er bætt við heilmikið af skrám, viljum við nota „00“ eða „11“ í stað „0“ eða „1“. Ef þú vilt fylla út núllin á þennan hátt, notaðu str.format() aðferðina.

str.format(args,*kwargs)
Framkvæmir strengjasniðsaðgerðir. Strenginn sem kallar fram þessa aðferð getur innihaldið venjulega stafi eða staðgöngureitir aðskildir með {}.Built-in Types — Python 3.10.0 Documentation

Setningafræði sniðforskriftastrengja
Sniðstrengurinn inniheldur „skiptireitinn“ innan um krullaða sviga {}.

Setningafræði skiptireitsins er sem hér segir:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Í einfaldari skilmálum byrjar skiptireiturinn á field_name, sem veldur því að gildi tilgreinds hlutar er sniðið og sett inn í úttakið í stað skiptireitsins. Á eftir field_name er hægt að fylgja eftir viðskiptareitnum með upphrópunarmerki ‘! Á eftir field_name er hægt að fylgja eftir viðskiptareitnum með upphrópunarmerki ‘! Format_spec má skrifa með tvípunkti ‘:’ í lokin. Þetta tilgreinir ekki sjálfgefið snið gildisins sem á að skipta út.
string — Common string operations — Python 3.10.0 Documentation

Ef þú vilt fylla það með 0 í bili skaltu gera eftirfarandi.

# 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

Dæmi um kóða til að bæta við streng/raðnúmeri á undan skrá

Fyrst skaltu fá skráarnafnið með os.path.basename(). Bættu síðan við streng eða raðnúmeri fyrir framan skráarnafnið og tengdu það saman við upprunalegu slóðina með os.path.join().

Eftirfarandi dæmi bætir img_ við framan öll skráarnöfn.

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)))

Niðurstaðan er sem hér segir.

.
└── testdir
    ├── img_a.jpg
    ├── img_b.jpg
    ├── img_c.jpg
    ├── img_d.jpg
    └── img_e.jpg

Ef þú vilt bæta við raðnúmerum skaltu breyta for setningunni í eitthvað á þessa leið: enumerate() til að fá tölurnar taldar í röð frá 0. Í þessu tilviki er talan fyllt með þremur tölustöfum.

for i, f in enumerate(files):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Hér er niðurstaðan.

.
└── testdir
    ├── 000_a.jpg
    ├── 001_b.jpg
    ├── 002_c.jpg
    ├── 003_d.jpg
    └── 004_e.jpg

Ef þú vilt byrja á 1 í stað 0 skaltu stilla seinni röksemdafærsluna fyrir enumerate á 1.

for i, f in enumerate(files, 1):
    os.rename(f, os.path.join(path, '{0:03d}'.format(i) +
                              '_' + os.path.basename(f)))

Þetta gengur svona.

.
└── testdir
    ├── 001_a.jpg
    ├── 002_b.jpg
    ├── 003_c.jpg
    ├── 004_d.jpg
    └── 005_e.jpg

Dæmi um kóða til að bæta við streng/raðnúmeri á eftir skrá

Notaðu os.path.splitext() til að skipta skránni í framlengingu og rótarslóð og bættu svo strengjum eða raðnúmerum við rótarslóðina. Í eftirfarandi dæmi er _img bætt við á eftir öllum skráarnöfnum.

import os
import glob

files = glob.glob('./testdir/*')

for f in files:
    ftitle, fext = os.path.splitext(f)
    os.rename(f, ftitle + '_img' + fext)

Niðurstaðan er þessi.

.
└── testdir
    ├── a_img.jpg
    ├── b_img.jpg
    ├── c_img.jpg
    ├── d_img.jpg
    └── e_img.jpg

Eins og með að bæta við streng/raðnúmeri á undan skrá, breyttu for setningunni þegar þú bætir við raðnúmeri.

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