파이썬으로 특정 디렉토리 내 모든 .txt 파일 찾기
파이썬에서 파일 I/O를 활용하여 특정 디렉토리 내의 모든 .txt 파일을 찾는 방법에 대해 알아보겠습니다. 이는 파일 처리, 데이터 분석 등 다양한 작업에서 기본적으로 필요한 기술입니다.
glob 모듈 사용하기
가장 간단하고 효율적인 방법은 glob
모듈을 사용하는 것입니다. glob
은 파일 경로 패턴을 사용하여 파일 목록을 가져오는 데 특화된 모듈입니다.
import glob
# 특정 디렉토리 내 모든 .txt 파일 찾기
txt_files = glob.glob("C:/my_directory/*.txt")
# 찾은 파일 목록 출력
for file in txt_txt_files:
print(file)
glob.glob("C:/my_directory/*.txt")
: "C:/my_directory" 디렉토리 내 모든 .txt 파일의 경로를 리스트 형태로 반환합니다.*
: 모든 문자열을 의미하는 와일드카드입니다.
os.walk() 함수 사용하기
디렉토리 구조를 순회하며 파일을 찾아야 할 경우 os.walk()
함수를 사용합니다. 이 함수는 디렉토리, 서브디렉토리, 파일 목록을 제공합니다.
import os
# 특정 디렉토리 내 모든 .txt 파일 찾기
for root, dirs, files in os.walk("C:/my_directory"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
os.walk("C:/my_directory")
: "C:/my_directory" 디렉토리와 하위 디렉토리를 순회하며 (root, dirs, files) 튜플을 반환합니다.root
: 현재 디렉토리 경로dirs
: 현재 디렉토리의 서브디렉토리 목록files
: 현재 디렉토리의 파일 목록
file.endswith(".txt")
: 파일 이름이 .txt로 끝나는지 확인합니다.
pathlib 모듈 사용하기
파이썬 3.4 이상에서는 pathlib
모듈을 사용하여 더욱 객체 지향적인 방식으로 파일 시스템을 다룰 수 있습니다.
from pathlib import Path
# 특정 디렉토리 내 모든 .txt 파일 찾기
txt_files = Path("C:/my_directory").rglob("*.txt")
# 찾은 파일 목록 출력
for file in txt_files:
print(file)
Path("C:/my_directory").rglob("*.txt")
: "C:/my_directory" 디렉토리와 하위 디렉토리를 재귀적으로 검색하여 .txt 파일을 생성합니다.
선택하기
- 간단한 검색:
glob
모듈이 가장 간편합니다. - 디렉토리 구조 순회:
os.walk()
함수를 사용합니다. - 객체 지향적인 방식:
pathlib
모듈이 적합합니다.
주의:
- 경로 구분자: Windows에서는
\
, Unix 계열에서는/
를 사용합니다. 하지만 파이썬에서는\
를 특수 문자로 인식하기 때문에\
대신\\
또는/
를 사용하거나os.path.join()
함수를 사용하여 경로를 합쳐주는 것이 좋습니다. - 절대 경로 vs 상대 경로: 위 예시는 절대 경로를 사용했지만, 상대 경로를 사용할 수도 있습니다.
활용 예시:
- 특정 디렉토리 내 모든 텍스트 파일을 읽어서 분석하기
- 특정 파일 형식의 파일을 백업하기
- 특정 키워드가 포함된 파일 찾기
파이썬으로 특정 디렉토리 내 모든 .txt 파일 찾기: 샘플 코드
glob 모듈을 사용한 간단한 예시
import glob
def find_txt_files(directory):
"""
지정된 디렉토리에서 모든 .txt 파일을 찾아 리스트로 반환합니다.
Args:
directory: 검색할 디렉토리 경로
Returns:
.txt 파일의 절대 경로 리스트
"""
txt_files = glob.glob(directory + "/*.txt")
return txt_files
# 사용 예시
directory = "C:/my_documents"
result = find_txt_txt_files(directory)
print(result)
os.walk() 함수를 사용한 하위 디렉토리까지 탐색
import os
def find_txt_files_recursive(directory):
"""
지정된 디렉토리 및 하위 디렉토리에서 모든 .txt 파일을 찾아 리스트로 반환합니다.
Args:
directory: 검색할 디렉토리 경로
Returns:
.txt 파일의 절대 경로 리스트
"""
txt_files = []
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".txt"):
txt_files.append(os.path.join(root, file))
return txt_fil es
# 사용 예시
directory = "C:/my_documents"
result = find_txt_files_recursive(directory)
print(result)
pathlib 모듈을 사용한 객체 지향적인 접근
from pathlib import Path
def find_txt_files_pathlib(directory):
"""
지정된 디렉토리 및 하위 디렉토리에서 모든 .txt 파일을 찾아 Path 객체 리스트로 반환합니다.
Args:
directory: 검색할 디렉토리 경로
Returns:
.txt 파일의 Path 객체 리스트
"""
txt_files = Path(directory).rglob("*.txt")
return txt_files
# 사용 예시
directory = "C:/my_documents"
result = find_txt_files_pathlib(directory)
for file in result:
print(file)
설명:
- 함수화: 각 코드는
find_txt_files
라는 함수로 구현하여 재사용성을 높였습니다. - 매개변수: 함수는 검색할 디렉토리 경로를 입력받는
directory
매개변수를 가집니다. - 리턴 값: 각 함수는 찾은 .txt 파일의 절대 경로를 리스트로 반환합니다.
- 주석: 코드에 주석을 추가하여 가독성을 높였습니다.
- pathlib:
pathlib
모듈을 사용한 예시에서는Path
객체를 사용하여 더욱 객체 지향적인 방식으로 파일 경로를 다룹니다.
선택:
- 간단한 작업:
glob
모듈을 사용한 예시가 간결합니다. - 하위 디렉토리 탐색:
os.walk()
함수를 사용한 예시가 적합합니다.
- 경로 구분자: Windows에서는
\\
또는/
, Unix 계열에서는/
를 사용합니다. - 상대 경로: 필요에 따라 상대 경로를 사용할 수 있습니다.
활용:
- 찾은 파일들을 열어 내용을 읽거나 수정
- 파일 목록을 다른 프로그램에 전달
- 파일 이름을 변경하거나 삭제
- 파일 크기, 수정 시간 등 파일 정보를 분석
추가 기능:
- 특정 패턴의 파일 이름만 찾기
- 파일 크기 기준으로 필터링
- 파일 수정 시간 기준으로 정렬
파이썬으로 특정 디렉토리 내 .txt 파일 찾기: 더 다양한 방법과 고급 기능
앞서 glob
, os.walk
, pathlib
모듈을 활용하여 .txt 파일을 찾는 방법을 살펴보았습니다. 이번에는 이러한 방법들을 확장하고, 더욱 다양한 조건과 기능을 추가하여 실제 문제 해결에 활용할 수 있도록 돕겠습니다.
정규 표현식 활용하기
glob
모듈의 패턴 매칭 기능을 넘어서, 정규 표현식을 활용하면 더욱 복잡한 파일 이름 패턴을 검색할 수 있습니다. re
모듈을 사용하여 정규 표현식을 적용하고, os.listdir()
함수로 디렉토리 내 파일 목록을 가져와 일일이 검사합니다.
import os
import re
def find_files_with_regex(directory, pattern):
"""
지정된 디렉토리에서 정규 표현식 패턴에 맞는 파일을 찾아 리스트로 반환합니다.
Args:
directory: 검색할 디렉토리 경로
pattern: 정규 표현식 패턴
Returns:
패턴에 맞는 파일의 절대 경로 리스트
"""
files = os.listdir(directory)
matched_files = []
for file in files:
if re.match(pattern, file):
matched_files.append(os.path.join(directory, file))
return matched_files
# 예시: 숫자로 시작하는 .txt 파일 찾기
directory = "C:/my_documents"
pattern = r"^\d+\.txt$"
result = find_files_with_regex(directory, pattern)
print(result)
파일 크기, 수정 시간 등 추가 조건 설정하기
os
모듈의 stat()
함수를 사용하여 파일의 크기, 수정 시간 등 다양한 정보를 얻을 수 있습니다. 이를 활용하여 추가적인 조건을 설정할 수 있습니다.
import os
def find_large_txt_files(directory, min_size):
"""
지정된 디렉토리에서 최소 크기 이상의 .txt 파일을 찾아 리스트로 반환합니다.
Args:
directory: 검색할 디렉토리 경로
min_size: 최소 파일 크기 (바이트)
Returns:
최소 크기 이상의 .txt 파일의 절대 경로 리스트
"""
large_files = []
for root, _, files in os.walk(directory):
for file in files:
if file.endswith(".txt"):
full_path = os.path.join(root, file)
file_stats = os.stat(full_path)
if file_stats.st_size >= min_size:
large_files.append(full_path)
return large_files
병렬 처리를 통한 성능 향상
많은 파일을 검색하는 경우, multiprocessing
모듈을 사용하여 병렬 처리를 통해 속도를 향상시킬 수 있습니다.
import os
from multiprocessing import Pool
# 병렬 처리를 위한 함수 (위의 함수들을 수정하여 사용)
def process_directory(directory):
# ...
# 사용 예시
directory = "C:/my_documents"
with Pool() as pool:
results = pool.map(process_directory, [directory])
파일 내용 검색하기
fileinput
모듈을 사용하여 여러 개의 파일을 순차적으로 읽으면서 특정 문자열을 검색할 수 있습니다.
import fileinput
def find_keyword_in_files(files, keyword):
"""
지정된 파일 목록에서 특정 키워드를 포함하는 파일을 찾습니다.
Args:
files: 파일 경로 리스트
keyword: 검색할 키워드
"""
for line in fileinput.input(files):
if keyword in line:
print(fileinput.filename(), line, end='')
추가 고려 사항
- 파일 인코딩: 다양한 인코딩 방식을 고려하여 파일을 읽어야 합니다.
encoding
인수를 사용하여 인코딩을 지정할 수 있습니다. - 에러 처리: 파일이 없거나 읽기 권한이 없는 경우 등 예외 상황을 처리해야 합니다.
try-except
블록을 사용하여 에러를 처리할 수 있습니다. - 성능 최적화: 많은 파일을 처리하는 경우, 파일 시스템 캐시를 활용하거나 파일 접근 횟수를 줄이는 등의 방법으로 성능을 최적화할 수 있습니다.
다양한 조합과 확장
위에 제시된 방법들을 조합하고, 필요에 따라 추가적인 기능을 구현하여 더욱 복잡하고 다양한 파일 검색 작업을 수행할 수 있습니다. 예를 들어, 정규 표현식을 사용하여 파일 이름과 내용을 동시에 검색하거나, 파일 크기와 수정 시간을 기반으로 파일을 분류하는 등의 작업이 가능합니다.
실제 문제 해결에 적용하기
- 로그 파일 분석: 로그 파일에서 특정 에러 메시지를 검색하거나, 특정 시간대의 로그를 추출합니다.
- 데이터 전처리: 대량의 텍스트 파일에서 필요한 데이터를 추출하여 분석에 사용합니다.
- 백업: 특정 조건에 맞는 파일만 백업합니다.
- 파일 정리: 중복 파일 찾기, 오래된 파일 삭제 등 파일 관리 작업을 자동화합니다.
python file-io