본문 바로가기

연구 노트/Python

파이썬으로 파일을 정렬하고 이름 변경하기

제가 평소에 다루는 파일 중에 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
...(생략)...

문자열을 앞에서부터 한 글자씩 비교해가며 정렬 한 결과 저렇게 되는 게 당연했습니다. 분명 이런 문제를 해결할 수 있는 방법이 있겠지만 빨리 구현하고 데이터를 전달해야 하는 상황이었습니다. 그래서 찾아볼 여유가 없었고 직접 구현하기로 하였습니다. 제가 떠올린 방법은 이랬습니다.

  1. 파일명에 포함된 숫자를 추출하여 정수형으로 변환하기
  2. 오름차순으로 정렬하기
  3. 정렬된 번호를 이용해서 순서대로 파일 불러오기

위 방법으로 진행해본 결과 원하는 순서대로 데이터를 선별할 수 있게 되었습니다. 파일명 변경은 파이썬의 기본 패키지인 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