728x90

특정 디렉토리 내 모든 파일을 읽어 문자열의 마지막 스페이스를 제거하고, 탭을 4개의 스페이스로 변환한 뒤 파일을 갱신하는 파이썬 코드를 재귀 호출 방식으로 수정해 작성하겠습니다. 이 코드는 하위 디렉토리를 직접 재귀적으로 탐색하며 텍스트 파일을 처리합니다.
코드 설명
-
재귀 디렉토리 순회: os.listdir와 재귀 호출을 사용해 디렉토리와 하위 디렉토리를 탐색.
-
파일 읽기/수정: 각 파일을 읽어 문자열을 처리한 후 원본 파일에 덮어씌움.
-
문자열 처리:
-
문자열 끝의 공백 제거: rstrip() 사용.
-
탭을 4개의 스페이스로 변환: replace('\t', ' ') 사용.
-
-
에러 처리: 파일 읽기/쓰기 중 발생할 수 있는 오류를 처리.
파이썬 코드
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)
코드 사용 방법
-
directory 변수에 처리할 디렉토리 경로를 지정하세요 (예: "C:/example/directory").
-
코드를 실행하면 지정된 디렉토리와 모든 하위 디렉토리의 텍스트 파일(.txt, .py, .md 등)을 재귀적으로 처리합니다.
-
처리 대상 확장자는 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
'Python을 배워보자' 카테고리의 다른 글
Oracle DB에서 저장 프로시저 호출 및 동적 데이터 처리 방법 (0) | 2025.04.27 |
---|---|
파이썬으로 오라클 스토어드 프로시저 실행하기: 다중 IN/OUT 파라미터와 커서 열 타입 출력 (0개 행 포함) (1) | 2025.04.26 |
MCP 구축과 활용: 커서와 파이썬을 활용한 상세 가이드 (0) | 2025.04.20 |
Python 패키지 관리자 uv: 속도와 편리함의 새로운 표준 (0) | 2025.04.20 |
Oracle DB Context MCP Server와 Vuetify로 동적 CRUD 화면 구현하기 (0) | 2025.04.20 |