파이썬으로 파일명 일괄 변경 프로그램 만들기 — 미리보기·중복 차단·되돌리기까지 직접 검증

업무 자료를 정리하다 보면 이름이 제각각인 파일이 빠르게 늘어납니다. 파일이 몇 개뿐이라면 직접 바꿀 수 있지만, 수십 개가 되면 같은 단어를 반복해서 입력해야 하고 번호가 빠지거나 순서가 뒤섞이기도 합니다. 이번에는 이런 반복 작업을 줄이기 위해 Python으로 파일명 일괄 변경 프로그램을 직접 제작하고 실제 파일로 검증했습니다.

단순히 파일명을 바꾸는 기능만 넣지는 않았습니다. 실행 전에 결과를 확인하는 미리보기, 중복 파일명 차단, Windows 금지 문자 검사, 확장자 필터, 마지막 작업 되돌리기까지 포함했습니다. 테스트 과정에서 v1.0의 사용성 문제도 발견했고, 이를 수정한 v1.1을 만든 뒤 단일 EXE에서도 변경과 복원이 정상적으로 작동하는지 확인했습니다.

Python으로 만든 JKLAB365 파일명 일괄 변경 프로그램 초기 화면
Python과 tkinter로 제작한 파일명 일괄 변경 프로그램의 초기 화면입니다.

이번에 직접 만든 기능

프로그램은 선택한 폴더 바로 아래의 파일을 읽고, 입력한 규칙에 따라 새 이름을 계산합니다. 하위 폴더는 건드리지 않도록 범위를 제한했습니다. 적용할 수 있는 규칙은 다음과 같습니다.

기능직접 적용한 내용
찾기·바꾸기파일명에 포함된 특정 문자열을 다른 문자열로 교체했습니다.
접두사·접미사원래 이름 앞이나 뒤에 공통 문구를 추가했습니다.
순번 추가시작 번호와 자릿수를 지정해 001, 002 형식으로 붙였습니다.
확장자 필터.txt, .csv처럼 변경할 파일 형식만 골랐습니다.
미리보기현재 파일명과 변경될 파일명을 표로 비교했습니다.
안전 검사중복 이름, 기존 파일 충돌, Windows 금지 문자를 실행 전에 차단했습니다.
되돌리기프로그램을 닫기 전 마지막 변경 작업을 원래 이름으로 복원했습니다.

화면은 Python 기본 GUI 라이브러리인 tkinter와 ttk로 구성했습니다. 별도의 GUI 패키지를 설치하지 않아도 되고, 폴더 선택에는 filedialog, 실행 확인과 결과 안내에는 messagebox를 사용했습니다.

실제 테스트 파일 6개를 준비했습니다

중요한 원본 파일을 바로 바꾸지 않고 별도의 테스트 폴더를 만들었습니다. CSV 파일 2개와 TXT 파일 4개를 준비했으며, 이름은 보고서·작업기록·회의자료처럼 실제 업무에서 사용할 법한 형태로 정했습니다.

  • 보고서_1.csv, 보고서_2.csv
  • 작업기록_오전.txt, 작업기록_오후.txt
  • 회의자료_검토.txt, 회의자료_초안.txt

변경 규칙은 접두사 정리_를 추가하고, 시작 번호 1과 자릿수 3을 선택했습니다. 미리보기 결과는 정리_보고서_1_001.csv부터 정리_회의자료_초안_006.txt까지 순서대로 계산되었습니다. 전체 6개가 ‘변경 예정’, 변경 없음 0개, 오류 0개로 표시되는 것도 확인했습니다.

접두사와 세 자리 순번을 적용한 파일명 변경 미리보기
접두사 ‘정리_’와 001~006 순번을 적용한 결과를 실행 전에 확인했습니다.

파일명을 바로 바꾸지 않고 계획부터 만들었습니다

파일명 변경에서 가장 중요한 부분은 실행 버튼보다 그 전에 수행하는 검사였습니다. 프로그램은 각 원본 파일에 대응하는 새 이름을 먼저 계산하고, 상태를 ‘변경 예정’, ‘변경 없음’, ‘오류’로 나누었습니다. 오류 항목이 하나라도 있으면 전체 실행을 막았습니다.

stem = source.stem
if options.find_text:
    stem = stem.replace(options.find_text, options.replace_text)

stem = f"{options.prefix}{stem}{options.suffix}"
if options.add_number:
    number = str(options.number_start + index).zfill(options.number_digits)
    stem = f"{stem}_{number}"

target_name = f"{stem}{source.suffix}"

위 로직처럼 파일의 본문 이름과 확장자를 분리한 뒤 규칙을 적용하고, 마지막에 원래 확장자를 다시 붙였습니다. 따라서 CSV와 TXT가 섞여 있어도 파일 형식은 그대로 유지되었습니다.

중복과 충돌을 어떻게 막았는가

서로 다른 두 파일이 같은 새 이름으로 계산되면 한 파일을 잃을 수 있습니다. 이를 방지하기 위해 새 파일명을 대소문자 구분 없이 비교했습니다. 같은 폴더에 변경 대상이 아닌 파일이 이미 존재하는 경우도 오류로 처리했습니다.

Windows에서 사용할 수 없는 < > : " / \ | ? * 문자와 CON, PRN, AUX 같은 예약 이름도 검사했습니다. 이름 끝의 공백이나 마침표도 허용하지 않았습니다. 실제 이름 변경은 임시 파일명을 거치는 2단계 방식으로 처리해, 파일 A와 B의 이름을 서로 맞바꾸는 경우에도 충돌하지 않도록 구성했습니다.

v1.0 테스트에서 중복 미리보기 문제를 발견했습니다

첫 번째 실행에서 파일 6개의 이름 자체는 정확히 변경되었습니다. 하지만 완료 안내창을 닫은 뒤 같은 규칙이 즉시 다시 계산되는 문제가 있었습니다. 화면에는 정리_정리_보고서_1_001_001.csv처럼 접두사와 번호가 두 번 적용된 이름이 다시 ‘변경 예정’으로 표시되었습니다.

v1.0에서 같은 규칙이 다시 계산된 중복 미리보기 문제
v1.0은 변경 직후 같은 규칙을 다시 계산해 접두사와 번호가 중복 표시되었습니다.

자동으로 두 번 변경된 것은 아니었지만, 사용자가 실행 버튼을 다시 누르면 실제로 중복된 이름이 될 수 있는 상태였습니다. 단순히 ‘파일 변경에 성공했다’고 끝냈다면 놓칠 수 있었던 부분이었습니다.

v1.1에서는 완료 결과를 고정해서 보여주었습니다

v1.1에서는 이름 변경 직후 미리보기 함수를 다시 실행하지 않도록 수정했습니다. 대신 방금 처리한 원본 이름과 새 이름을 표에 그대로 남기고 상태를 ‘변경 완료’로 표시했습니다. 상단에도 ‘6개 파일 변경 완료 | 마지막 작업 되돌리기 가능’이라는 문구를 표시했습니다.

파일 6개를 변경한 뒤 변경 완료 상태가 표시된 화면
v1.1에서는 처리한 6개 파일을 ‘변경 완료’ 상태로 고정해 보여주었습니다.

되돌리기도 같은 방식으로 개선했습니다. 마지막 작업 되돌리기를 누르면 변경된 이름을 원본 이름으로 다시 연결하고, 임시 파일명을 거쳐 안전하게 복원했습니다. 복원 후에는 각 항목을 ‘복원 완료’로 표시했습니다.

변경된 파일 6개를 원래 이름으로 복원한 화면
마지막 작업 되돌리기로 6개 파일을 원래 이름으로 복원했습니다.

자동 검사와 실제 파일 변경을 함께 확인했습니다

화면만 확인하지 않고 임시 폴더에 파일을 생성해 자동 검사도 진행했습니다. 접두사·접미사·순번, 확장자 필터, 중복 대상 이름, 기존 파일 충돌, Windows 금지 이름, 파일명 교환, 한글 파일 변경과 되돌리기까지 총 7개 검사를 통과했습니다.

검증 항목결과
접두사·접미사·순번 조합통과했습니다.
확장자 필터선택한 확장자만 처리했습니다.
여러 파일의 새 이름 중복실행 전에 오류로 차단했습니다.
기존 파일과의 충돌덮어쓰지 않고 오류로 차단했습니다.
Windows 금지 문자와 예약 이름입력 단계에서 차단했습니다.
두 파일 이름 맞바꾸기임시 이름을 거쳐 정상 처리했습니다.
한글 파일명 변경과 되돌리기변경과 원상 복원 모두 성공했습니다.

마지막으로 단일 EXE로 만들어 다시 실행했습니다

Python이 설치되지 않은 환경에서도 실행하기 쉽도록 PyInstaller의 onefile 방식으로 단일 EXE를 만들었습니다. 이전 글에서 onedir와 onefile 구조를 자세히 비교했으므로, 이번에는 실제 사용한 명령과 결과만 기록했습니다.

py -m PyInstaller --onefile --windowed --clean ^
  --name "JKLAB365_FileName_Batch_Renamer" main.py
PyInstaller onefile windowed 옵션으로 파일명 변경 프로그램을 빌드한 명령
콘솔창이 나타나지 않는 단일 EXE를 만들기 위해 onefile과 windowed 옵션을 사용했습니다.

dist 폴더에는 JKLAB365_FileName_Batch_Renamer.exe 파일 하나가 생성되었고, 크기는 11,965KB로 약 11.7MB였습니다. EXE를 더블클릭했을 때 별도의 콘솔창 없이 프로그램이 열렸습니다. EXE에서도 같은 테스트 폴더를 선택해 미리보기, 6개 파일 변경, 마지막 작업 되돌리기를 다시 실행했으며 모두 정상 작동했습니다.

직접 사용한다면 먼저 복사본으로 확인해야 합니다

파일명 변경은 짧은 코드로도 구현할 수 있지만, 업무 파일을 다룰 때는 실행 전 확인과 충돌 방지가 더 중요했습니다. 프로그램을 사용한다면 다음 원칙을 지키는 것이 좋습니다.

  • 중요한 원본 폴더가 아니라 복사본이나 테스트 폴더에서 먼저 실행합니다.
  • ‘변경 예정’ 목록에서 파일 수, 순번, 확장자를 확인합니다.
  • 오류 항목이 있다면 실행하지 말고 규칙부터 수정합니다.
  • 파일이 다른 프로그램에서 열려 있다면 닫은 뒤 실행합니다.
  • 되돌리기는 같은 프로그램 실행 중 마지막 작업 1회만 지원한다는 점을 확인합니다.

마무리

이번 작업에서는 Python으로 GUI를 만드는 것보다 안전하게 파일을 바꾸는 흐름에 더 많은 비중을 두었습니다. 변경 계획을 먼저 만들고, 중복과 금지 이름을 차단하고, 임시 파일을 거쳐 실제 이름을 바꾸도록 구성했습니다. 또한 한 번의 성공 화면으로 끝내지 않고 v1.0의 중복 미리보기 문제를 발견해 v1.1로 수정했으며, Python 실행과 단일 EXE 실행에서 같은 결과를 확인했습니다.

반복되는 파일 정리 작업이 있다면 거대한 자동화 도구부터 시작하지 않아도 됩니다. 자주 사용하는 규칙 하나를 정하고, 미리보기와 되돌리기를 갖춘 작은 프로그램부터 직접 검증해 보는 방법이 실용적이었습니다.

참고자료

Leave a Comment