Python을 배워보자

파이썬으로 디렉토리 내 파일의 문자열 처리 및 갱신하기 (재귀 호출 방식)

_Blue_Sky_ 2025. 4. 24. 21:00
728x90
 
 
특정 디렉토리 내 모든 파일을 읽어 문자열의 마지막 스페이스를 제거하고, 탭을 4개의 스페이스로 변환한 뒤 파일을 갱신하는 파이썬 코드를 재귀 호출 방식으로 수정해 작성하겠습니다. 이 코드는 하위 디렉토리를 직접 재귀적으로 탐색하며 텍스트 파일을 처리합니다.
코드 설명
  1. 재귀 디렉토리 순회: os.listdir와 재귀 호출을 사용해 디렉토리와 하위 디렉토리를 탐색.
  2. 파일 읽기/수정: 각 파일을 읽어 문자열을 처리한 후 원본 파일에 덮어씌움.
  3. 문자열 처리:
    • 문자열 끝의 공백 제거: rstrip() 사용.
    • 탭을 4개의 스페이스로 변환: replace('\t', ' ') 사용.
  4. 에러 처리: 파일 읽기/쓰기 중 발생할 수 있는 오류를 처리.
파이썬 코드
import os

def process_file(file_path):
    try:
        # 텍스트 파일만 처리 (확장자 제한 가능)
        if file_path.endswith(('.txt', '.py', '.md')):  # 필요 시 확장자 추가
            # 파일을 한 줄씩 읽어서 처리하며, 바로 쓰기
            with open(file_path, 'r', encoding='utf-8') as infile, \
                 open(file_path + '.tmp', 'w', encoding='utf-8') as outfile:

                for line in infile:
                    # 탭을 공백 4개로 변환하고 끝 공백 제거
                    modified_line = line.replace('\t', '    ').rstrip()
                    outfile.write(modified_line + '\n')

            # 임시 파일을 원본 파일로 교체
            import os
            os.replace(file_path + '.tmp', file_path)

            print(f"Processed: {file_path}")
    except Exception as e:
        print(f"Error processing {file_path}: {e}")


def process_directory(directory_path):
    try:
        # 디렉토리 내 모든 항목 순회
        for item in os.listdir(directory_path):
            item_path = os.path.join(directory_path, item)
            
            if os.path.isfile(item_path):
                # 파일이면 처리
                process_file(item_path)
            elif os.path.isdir(item_path):
                # 디렉토리면 재귀 호출
                process_directory(item_path)
    except Exception as e:
        print(f"Error accessing {directory_path}: {e}")

# 사용 예시
directory = "C:/example/directory"  # 원하는 디렉토리 경로
process_directory(directory)
코드 사용 방법
  1. directory 변수에 처리할 디렉토리 경로를 지정하세요 (예: "C:/example/directory").
  2. 코드를 실행하면 지정된 디렉토리와 모든 하위 디렉토리의 텍스트 파일(.txt, .py, .md 등)을 재귀적으로 처리합니다.
  3. 처리 대상 확장자는 process_file 함수의 if file_path.endswith(...)에서 수정 가능.
재귀 호출 방식의 특징
  • 명시적 재귀: os.walk 대신 os.listdir와 재귀 호출을 사용해 디렉토리를 탐색.
  • 유연성: 디렉토리 구조를 명확히 제어하며, 특정 디렉토리를 건너뛰는 로직 추가 가능.
  • 단점: 매우 깊은 디렉토리 구조에서는 스택 오버플로우 위험이 있음 (파이썬의 기본 재귀 제한은 약 1000).
주의사항
  • 인코딩: 파일 읽기/쓰기 시 utf-8 인코딩 사용. 필요 시 encoding 값 변경.
  • 백업: 파일을 덮어씌우므로 중요한 파일은 백업 권장.
  • 확장자 제한: .txt, .py, .md 파일만 처리. 필요 시 확장자 추가/제거.
  • 에러 처리: 파일/디렉토리 접근 권한, 인코딩 오류 등을 고려해 예외 처리 포함.
  • 재귀 깊이: 깊은 디렉토리 구조에서는 sys.setrecursionlimit()으로 재귀 제한을 늘릴 수 있으나 주의 필요.
실행 결과
코드를 실행하면 각 파일이 처리될 때마다 Processed: 파일경로가 출력되며, 오류가 발생하면 Error processing 파일경로: 오류메시지 또는 Error accessing 디렉토리: 오류메시지가 출력됩니다.
추가 개선 가능성
  • 디렉토리 제외: .git, node_modules 같은 디렉토리를 스킵하는 조건 추가.
  • 재귀 제한 관리: 깊은 디렉토리 처리 시 sys.setrecursionlimit() 사용 또는 비재귀 방식 병행.
  • 로그 파일 생성: 처리된 파일 목록을 로그로 저장.
 
728x90