파일 이름 앞뒤에 문자열 또는 일련 번호를 추가하여 Python에서 파일 이름 일괄 변경

사업

os 모듈 및 glob 모듈을 사용하여 일괄적으로 이름을 바꿉니다.

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']

.jpg 대신 인수 경로를 추가하여 다음을 얻을 수 있습니다.
./testdir/a.jpg

와일드카드(*)를 사용하여 아래와 같이 특정 확장자만 가져올 수도 있습니다.
glob.glob('./testdir/*.jpg')

다음 패턴 매칭을 사용할 수 있습니다.

  • *: 모든 것과 일치합니다.
  • ?모든 단일 문자와 일치합니다.
  • [abc]: b, c 또는 c의 단일 문자와 일치합니다.
  • [!abc]: 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으로 채워진 일련 번호 생성

예를 들어, 수십 개의 파일에 일련 번호를 추가할 때 “0” 또는 “1” 대신 “00” 또는 “11”을 사용하려고 합니다. 이 방법으로 0을 채우려면 str.format() 메서드를 사용하십시오.

str.format(args,*kwargs)
문자열 형식화 작업을 수행합니다. 이 메서드를 호출하는 문자열은 일반 문자 또는 {}로 구분된 대체 필드를 포함할 수 있습니다.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 문을 다음과 같이 변경합니다. 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

0 대신 1로 시작하려면 enumerate의 두 번째 인수를 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