본문 바로가기

미래 먹거리를 위하여

[파이썬 정복하기] 라이브러리 6장 - 파일과 디렉터리 다루기3 (맥OS 기준) ★ 파일 관리 실무 모듈 — fnmatch(찾기), linecache(읽기), shutil(옮기기)

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번째 문자는 숫자이다.

점프 투 파이썬 - 라이브러리 예제 편 6장 41번 문제 해석 및 결과1
점프 투 파이썬 - 라이브러리 예제 편 6장 41번 문제 해석 및 결과2(최신 풀이버전)

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개 속담 중 한 개를 무작위로 선택해서 출력하는 프로그램은 어떻게 작성해야 할까?

★ 파일을 현재 작업중인 폴더로 옮겨줘야 오류가 나지 않는다.(참고)

점프 투 파이썬 - 라이브러리 예제 편 6장 42번 문제 해석 및 결과

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 디렉터리는 이미 만들었다고 가정한다.

점프 투 파이썬 - 라이브러리 예제 편 6장 43번 문제 해석 및 결과