Dosya adından önce ve sonra bir dize veya sıra numarası ekleyerek Python’da bir dosya adını toplu olarak değiştirin

İşletim sistemi modülünü ve glob modülünü kullanarak toplu olarak yeniden adlandırın.

Dosya adlarından önce ve sonra dizeler veya sıralı sayılar ekleyerek bir klasördeki dosya adlarını toplu olarak değiştirmek ve yeniden adlandırmak için os modülünü ve glob modülünü kullanın.

Örnek dosya yapısı

Örnek olarak aşağıdaki dosya yapısını alın. Bu durumda, klasörde yalnızca dosya (klasör yok) olduğu varsayılır.

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

Akılda tutulması gerekenler

İşlem, dosyanın yeniden adlandırılmasını içerdiğinden, hata durumunda kaydedilebilmesi için orijinal dosyayı ayrı olarak kaydedin.

Glob modülü ile dosya listesini alın

Glob modülü, Unix kabuğu tarafından kullanılan kurallara göre belirtilen kalıpla eşleşen tüm yol adlarını bulacaktır.
glob — Unix style pathname pattern expansion — Python 3.10.0 Documentation

Örneğin, geçerli dizindeki dosya ve dizin adlarının bir listesini almak için aşağıdaki işlev kullanılabilir.
glob.glob('./*')
Argüman, mutlak bir yol veya göreli bir yol olabilir.

Bu örnekte, aşağıdaki gibi görünecektir.

import glob

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

a.jpg yerine, argüman yolu eklenmiş olarak aşağıdakini elde edebilirsiniz.
./testdir/a.jpg

Aşağıda gösterildiği gibi, yalnızca belirli uzantıları almak için joker karakterler (*) de kullanabilirsiniz.
glob.glob('./testdir/*.jpg')

Aşağıdaki desen eşleştirme kullanılabilir.

  • *: Her şeyle eşleşir.
  • ?Herhangi bir tek karakterle eşleşir.
  • [abc]: a, b veya c’den tek bir karakterle eşleşir.
  • [!abc]: a, b veya c dışında tek bir karakterle eşleşir

os.rename() ile yeniden adlandırın

os.rename(src, dst, *, src_dir_fd=None, dst_dir_fd=None)
Dosyayı veya dizini src olarak dst olarak yeniden adlandırın.
os — Miscellaneous operating system interfaces — Python 3.10.0 Documentation

Adından da anlaşılacağı gibi onu yeniden adlandıracak olan os modülünün rename() işlevini kullanın.

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

Ardından, a.jpg, a_000.jpg olarak yeniden adlandırılacaktır.

str.format() ile sıfır doldurulmuş sıralı sayılar oluşturma

Örneğin onlarca dosyaya sıralı sayılar eklerken “0” veya “1” yerine “00” veya “11” kullanmak istiyoruz. Sıfırları bu şekilde doldurmak istiyorsanız str.format() yöntemini kullanın.

str.format(args,*kwarglar)
Dize biçimlendirme işlemlerini gerçekleştirir. Bu yöntemi çağıran dize, {} ile ayrılmış normal karakterler veya ikame alanları içerebilir.Built-in Types — Python 3.10.0 Documentation

Biçim belirtimi dizelerinin sözdizimi
Biçimlendirme dizesi, küme parantezleri {} içine alınmış “değiştirme alanı” içerir.

Değiştirme alanının sözdizimi aşağıdaki gibidir:
replacement_field ::= "{" [field_name] ["!" conversion] [":" format_spec] "}"

Daha basit bir ifadeyle, değiştirme alanı, belirtilen nesnenin değerinin biçimlendirilmesine ve değiştirme alanı yerine çıktıya eklenmesine neden olan alan_adı ile başlar. Alan_adı’ndan sonra, dönüştürme alanını bir ünlem işareti ‘! Alan_adı’ndan sonra, dönüştürme alanını bir ünlem işareti ‘! format_spec, sonunda iki nokta üst üste ‘:’ ile yazılabilir. Bu, değiştirilecek değerin varsayılan olmayan biçimini belirtir.
string — Common string operations — Python 3.10.0 Documentation

Şimdilik 0 ile doldurmak istiyorsanız aşağıdakileri yapın.

# 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

Bir dosyadan önce bir dize/sıralı sayı eklemek için kod örneği

İlk önce, os.path.basename() ile dosya adını alın. Ardından, dosya adının önüne bir dize veya sıra numarası ekleyin ve os.path.join() ile orijinal yolla birleştirin.

Aşağıdaki örnek, tüm dosya adlarının önüne img_ ekler.

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

Sonuç aşağıdaki gibidir.

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

Sıralı sayılar eklemek istiyorsanız, 0’dan itibaren sayılan sayıları almak için for deyimini şuna benzer bir şekilde değiştirin: enumerate(). Bu durumda, sayı üç basamakla doldurulur.

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

İşte sonuç.

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

0 yerine 1 ile başlamak istiyorsanız, numaralandırmanın ikinci argümanını 1 olarak ayarlayın.

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

Bu böyle devam ediyor.

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

Bir dosyadan sonra bir dize/sıralı sayı eklemek için kod örneği

Dosyayı uzantı ve kök yoluna bölmek için os.path.spltext() kullanın ve ardından kök yoluna dizeler veya sıralı sayılar ekleyin. Aşağıdaki örnekte, tüm dosya adlarından sonra _img eklenir.

import os
import glob

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

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

Sonuç bu.

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

Bir dosyadan önce bir dize/sıralı numara eklerken olduğu gibi, sıralı bir sayı eklerken for ifadesini değiştirin.

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