OS: MAC
참고: 👉 점프 투 파이썬 - 라이브러리 예제 바로가기
041. 특정 파일만 찾으려면? ― fnmatch(에프엔매치)
- glob과 비슷하지만 실제 파일 검색이 아닌 이름 문자열 매칭용
- 실제 파일이 없어도 검사 가능
- 대소문자 구분은 OS마다 다름(Windows는 구분 안 함)
| 구분 | 설명 | 예시 | 결과 |
| 모듈명 | 파일 이름 문자열이 특정 패턴(*.txt, data?.csv) 과 일치하는지 검사하는 문자열 매칭용 모듈 |
import fnmatch |
문자열이 패턴과일치하면 리스트에서 패턴에 맞는 항목만 반환 |
| 패턴 기호 |
* : 모든 문자(0개 이상) ? : 임의의 한 문자 [abc] : 대괄호 안 문자 중 하나 일치 [!seq]: 대괄호 안에 없는 문자와 일치 |
import fnmatch fnmatch.fnmatch('hello.txt', '*.txt') |
True |
| 예시 | fnmatch.fnmatch(name, pattern) Truefnmatch.filter(names, pattern) 문자열이 패턴과 일치하면 리스트에서 패턴에 맞는 항목만 반환 |
import fnmatch name = "report.txt" # 검사할 파일 이름 pattern = "*.txt" # 비교할 패턴 print(fnmatch.fnmatch(name, pattern)) |
True |
| 예시 | 현재 폴더 내 .txt 파일 찾기 (현재 폴더에 있는 모든 .txt 파일 이름 출력) |
import fnmatch, os for name in os.listdir('.'): if fnmatch.fnmatch(name, '*.txt'): print(name) |
b.txt a.txt |
| 하위 폴더까지 검색 | 하위 폴더 포함 .py 파일 찾기 (현재 및 모든 하위 폴더의 .py 파일 전체 경로 출력) |
import fnmatch, os for path, dirs, files in os.walk('.'): for name in files: if fnmatch.fnmatch(name, '*.py'): print(os.path.join(path, name)) |
./tesseract_test.py . . #사용자마다 출력값이 다름참고 |
| filter() 사용 예시 | 리스트에서 .py 확장자만 필터링 | import fnmatch names = ['a.py', 'b.txt', 'c.py'] print(fnmatch.filter(names, '*.py')) |
['a.py', 'c.py'] |
라이브러리 예제 문제:
현재 폴더의 모든 파일 중에서 다음과 같은 조건을 모두 만족하는 파일들을 찾아서 출력하고자 한다. 어떻게 프로그램을 만들어야 할까?
| - 파일명은 a로 시작한다. - 확장자는 파이썬 파일을 의미하는 .py 이다. - 확장자를 제외한 파일명의 길이는 5이다. - 파일명의 마지막 5번째 문자는 숫자이다. |


042. 파일에서 무작위로 한 줄만 가져오려면? ― linecache(라인캐시)
- 텍스트 파일의 특정 줄을 빠르게 접근 가능 (내부적으로 캐싱)
- open()과 readline()보다 간단, 줄 번호는 1부터 시작
- 캐싱 때문에 파일 내용이 바뀌어도 갱신되지 않음 (clearcache() 필요)
| 구분 | 설명 | 예시 | 결과 |
| 모듈 | 파일 전체를 읽지 않고 특정 줄을 빠르게 불러올 수 있는 모듈 |
import linecache | — |
| 예시 | linecache.getline(filename, n) 지정한 파일(filename)의 n번째 줄 반환 |
import linecache line = linecache.getline('example.txt', 3) print(line.strip()) |
example.txt의3번째 줄 출력 |
| 예시 | 무작위 한 줄 가져오기 | import linecache, random filename = 'example.txt' lines = open(filename).readlines() rand_line = random.randint(1, len(lines)) print(linecache.getline(filename, rand_line).strip()) |
example.txt 파일 중 임의의 한 줄을 랜덤으로 출력 |
| 예시 | 캐시 초기화 | import linecache linecache.clearcache() |
linecache가 저장해둔 캐시 정보 초기화 |
라이브러리 예제 문제: 다음은 속담 퀴즈 프로그램에 사용할 속담 100개를 저장한 saying.txt 파일이다.(파일 다운받기)
이 파일의 100개 속담 중 한 개를 무작위로 선택해서 출력하는 프로그램은 어떻게 작성해야 할까?
★ 파일을 현재 작업중인 폴더로 옮겨줘야 오류가 나지 않는다.(참고)

043. 파일을 복사하거나 이동하려면? ― shutil(슈틸)
| 구분 | 설명 | 예시 | 결과 |
| 모듈 | 파일 및 디렉터리의 복사(copy), 이동(move), 삭제(remove) 등을 지원하는 모듈 | import shutil | — |
| 파일 복사 | 파일을 한 위치에서 다른 위치로 복사 | import shutil shutil.copy('a.txt', 'b.txt') |
'b.txt' # a.txt → b.txt로 복사됨 |
| 파일 메타데이터까지 복사 | 파일의 내용뿐 아니라 권한·시간정보까지 복사 | import shutil shutil.copy2('a.txt', 'b.txt') |
'b.txt' # a.txt의 속성까지 복사됨 |
| 디렉터리 복사 | 전체 폴더를 통째로 복사 # 사전에 복사할 원본 폴더(src)가 있어야함 import os os.mkdir('src') with open('src/test.txt', 'w') as f: f.write('hello shutil') |
import shutil shutil.copytree('src', 'dst') |
'dst' # src 폴더 전체가 dst로 복사됨 |
| 파일 이동 | 파일이나 폴더를 새 위치로 이동 | import shutil shutil.move('a.txt', 'archive/') |
'archive/a.txt' # a.txt → archive/ 폴더로 이동 |
| 파일/폴더 삭제 | 파일이나 폴더를 삭제 (주의 필요⚠️) | import shutil, os os.remove('a.txt') shutil.rmtree('archive') |
삭제 후 결과값이 출력되지 않음. 검토 시 코드: print(os.listdir('.')) #파일 또는 폴더 완전 삭제 |
라이브러리 예제 문제: 작업 중인 파일을 자동으로 백업하는 기능을 구현하고자 c:\doit\a.txt 파일을 c:\temp\a.txt.bak이라는 이름으로 복사하는 프로그램을 만들고자 한다. 어떻게 만들어야 할까? c:\doit 디렉터리에 a.txt 파일을 만드는 중이며 백업용 c:\temp 디렉터리는 이미 만들었다고 가정한다.
