제가 평소에 다루는 파일 중에 capture_{번호}.bmp
라는 형식으로 저장된 이미지 파일들이 있습니다. 저는 이 파일들을 sequence_{스텝 번호}_{패턴 번호}.bmp
라는 형식으로 파일 이름을 고치려고 합니다. 이때 {패턴 번호}
는 0부터 5까지 순환 증가하고 {스텝 번호}
는 패턴 번호가 5에서 0으로 바뀔 때마다 1씩 증가해야 합니다. 결과를 예상해보자면 다음과 같이 파일명이 바뀔 것입니다.
capture_0.bmp --> sequence_0_0.bmp
capture_1.bmp --> sequence_0_1.bmp
capture_2.bmp --> sequence_0_2.bmp
capture_3.bmp --> sequence_0_3.bmp
capture_4.bmp --> sequence_0_4.bmp
capture_5.bmp --> sequence_0_5.bmp
capture_6.bmp --> sequence_1_0.bmp
capture_7.bmp --> sequence_1_1.bmp
capture_8.bmp --> sequence_1_2.bmp
capture_9.bmp --> sequence_1_3.bmp
capture_10.bmp --> sequence_1_4.bmp
capture_11.bmp --> sequence_1_5.bmp
capture_12.bmp --> sequence_2_0.bmp
capture_13.bmp --> sequence_3_1.bmp
...(생략)...
일단 파이썬으로 살펴보고자 하는 디렉토리 안에서 파일 리스트를 뽑아보았는데요, 여기서 문제가 생겼습니다. 리스트 안에 파일이 순서대로 들어가 있길 바랐지만 실제로는 아래와 같은 순서로 정렬된 것을 발견하였습니다.
capture_0.bmp
capture_1.bmp
capture_10.bmp
capture_11.bmp
...(생략)...
capture_19.bmp
capture_2.bmp
capture_20.bmp
capture_21.bmp
...(생략)...
문자열을 앞에서부터 한 글자씩 비교해가며 정렬 한 결과 저렇게 되는 게 당연했습니다. 분명 이런 문제를 해결할 수 있는 방법이 있겠지만 빨리 구현하고 데이터를 전달해야 하는 상황이었습니다. 그래서 찾아볼 여유가 없었고 직접 구현하기로 하였습니다. 제가 떠올린 방법은 이랬습니다.
- 파일명에 포함된 숫자를 추출하여 정수형으로 변환하기
- 오름차순으로 정렬하기
- 정렬된 번호를 이용해서 순서대로 파일 불러오기
위 방법으로 진행해본 결과 원하는 순서대로 데이터를 선별할 수 있게 되었습니다. 파일명 변경은 파이썬의 기본 패키지인 os
패키지에 포함된 rename 함수를 사용하면 됩니다. 아래는 구현된 코드입니다.
import os
directory = './your_dir/'
file_list = [f for f in os.listdir(directory) if '.bmp' in f]
num_list = sorted([int(l.split('_')[1].split('.')[0]) for l in file_list])
for idx in range(len(file_list)):
step = int(idx / 6)
ptrn = idx % 6
src_file = directory + 'capture_{}.bmp'.format(num_list[idx])
output = directory + 'sequence_{}_{}.bmp'.format(step, ptrn)
print('{} --> {}'.format(src_file, output))
os.rename(src_file, output)
실행 결과 예상대로 파일명이 잘 변환된 것을 확인하였습니다. 이와 유사한 패턴으로 파일명을 변경해야 할 때 필요한 부분만 수정하고 재사용할 수 있을 것으로 기대합니다.
'연구 노트 > Python' 카테고리의 다른 글
파이썬으로 원하는 데이터 골라내기 (0) | 2020.12.08 |
---|