You are on page 1of 18

2 파일과 예외처리

목차 1 2

디렉토리 이진파일과
작업 임의 접근
파일

3 4

객체 출력 정규식
디렉토리 작업
파이썬 프로그램을 활용한 파일 처리 중
디렉토리에 있는 전체 파일을 찾아서 처리해야 하는 경우가 있음
• os모듈에서 제공하는 도구의 사용이 가능
 Review: os모듈은 운영체제에서 제공하는 여러 기능을 파이썬에서 수행

작업 디렉토리(CWD: Current Working Directory)


• 현재 파이썬이 실행되는 디렉토리
디렉토리 작업
os모듈을 활용한 작업디렉토리(CWD) 관리
import os

작업 디렉토리를 얻으려면 다음과 같은 함수 호출을 사용한다.


>>> dir = os.getcwd( )

작업 디렉토리를 변경할 수 있다.


>>> subdir = "data"
>>> os.chdir(subdir)

작업 디렉토리 안에 있는 파일들의 리스트를 얻으려면


listdir( ) 함수를 사용한다.
>>> for filename in os.listdir( ) :
print(filename)

파일만 처리하려면 다음과 같이 isfile( ) 함수를 사용한다.


>>> if os.path.isfile(filename) :
print("파일입니다.")
디렉토리 작업
endswith()를 활용한 확장자 검사
• 작업 디렉토리 내에서 확장자가 jpg인 파일을 모두 찾기
import os

cwd = os.getcwd( )
files = os.listdir( )
for name in files :
if os.path.isfile(name) :
if name.endswith(".jpg") :
print(name)

DSC04886_11.jpg
DSC04886_12.jpg
DSC04886_13.jpg
이진파일과 임의 접근 파일
이진파일
• 데이터가 문자열로 변환되지 않고 직접 저장되어 있는 형태

장점: 시간적 공간적 효율성


• 텍스트로 읽은 데이터를 정수로 변환하는 시간이 필요 없음
• 텍스트 파일에 비해 저장공간도 적게 차지함
(위의 그림을 보면 6개의 상자(byte)에서 4개로 감소)

단점: 인간이 파일의 내용을 이해하기 힘듦


이진파일과 임의 접근 파일
이진파일 읽기
이진 파일에서 데이터를 읽으려면 다음과 같이 파일을 열어야 한다.

>>> infile = open(filename, "rb")

입력 파일에서 8 바이트를 읽으려면 다음과 같은 문장을 사용한다.


>>> bytesArray = infile.read(8)

첫 번째 바이트를 꺼내려면 다음과 같은 문장을 사용하면 된다.


>>> byte1 = bytesArray[0]

이진 파일에 바이트들을 저장하려면 다음과 같이 한다.


>>> outfile = open(filename, "wb")
>>> bytesArray = bytes([255, 128, 0, 1])
>>> outfile.write(bytesArray)

• bytes는 1바이트 단위의 값을 연속적으로 저장하는 시퀀스 자료형


• 1바이트? 0~255 (또는 –128~127)
이진파일과 임의 접근 파일
순차 접근과 임의 접근
• 순차 접근(sequential access):
데이터를 파일의 처음부터 순차적으로 읽거나 기록하는 방식
 Review: 한번 읽은 데이터를 다시 읽으려면?
→ 파일을 닫고 파일을 다시 열어야 함
• 임의 접근(random access)
 파일의 어느 위치에서든지 읽기와 쓰기가 가능

순차 접근 파일

임의 접근 파일
이진파일과 임의 접근 파일
임의 접근의 원리
• 모든 파일에는 파일 포인터(file pointer)라는 것이 존재
• 읽기와 쓰기 동작에 현재 어느 위치에서 이루어지는지를 나타냄
 읽기와 쓰기가 진행될 때 자동 이동 진행

파일내 임의의 위치에 접근하기 위해서는?


파일 포인터의 위치를 임의로 변경
• seek( ) 메소드 사용
infile.seek(position)

• 현재 파일포인터의 위치는 tell( ) 메소드로 확인 가능


이진파일과 임의 접근 파일
임의 접근의 예제
• 텍스트 파일에서 몇 개의 문자를 읽은 후에 seek( )를 이용하여
다시 파일의 처음으로 돌아가 보자
infile = open("test.txt", "r+") #읽기 및 쓰기 용도
str = infile.read(10);
print("읽은 문자열 : ", str)
position = infile.tell( );
print("현재 위치: ", position)

position = infile.seek(0);
str = infile.read(10);
print("읽은 문자열 : ", str)
infile.close( )

읽은 문자열 : abcdefghij
현재 위치: 10
읽은 문자열 : abcdefghij
객체 출력
지금까지의 출력의 주 대상: 문자열 또는 바이트
• 하지만 딕셔너리도 자주 사용되는 출력 대상
gameOption = {
"Sound": 8,
"VideoQuality": "HIGH",
"Money": 100000,
"WeaponList": ["gun", "missile", "knife" ]
}

• 딕셔너리나 리스트와 같은 파이썬 내의 객체도 파일에 쓸 수 있을까?


파일에서 읽을 수 있을까?
 둘 다 가능
 예를 들어 게임에서 플레이어의 현재 상태를 파일에 저장했다가
다시 불러 올 수 있음
객체 출력
pickle 모듈 사용
• pickle 모듈의 dump( )와 load( ) 메소드를 사용하면
객체를 쓰고 읽을 수 있음
• dump( ): 피클을 병 안에 넣는 형태 (압축 및 포장)
객체 출력
pickle 모듈 사용
• pickle 모듈의 dump( )와 load( ) 메소드를 사용하면
객체를 쓰고 읽을 수 있음
• dump( ): 피클을 병 안에 넣는 형태 (압축 및 포장)
import pickle

gameOption = {
"Sound": 8,
"VideoQuality": "HIGH",
"Money": 100000,
"WeaponList": ["gun", "missile", "knife" ]
}

file = open( "save.p", "wb" ) # 이진 파일 오픈


pickle.dump( gameOption, file ) # 딕셔너리를 피클 파일에 저장
file.close( ) # 파일을 닫는다.
객체 출력
pickle 모듈 사용
• pickle 모듈의 dump( )와 load( ) 메소드를 사용하면
객체를 쓰고 읽을 수 있음
• load( ): 압축된 피클을 다시 객체로 복호화
import pickle

obj = pickle.load( open( "save.p", "rb" ) ) # 피클 파일에 딕션너리를 로딩


print(obj)

{'WeaponList': ['gun', 'missile', 'knife'], 'Money': 100000,


'VideoQuality': 'HIGH', 'Sound': 8}
정규식
정규식(regular expression)
• 특정한 규칙을 가지고 있는 문자열을 메타 문자를 이용하여 표현하는 수식

메타문자
식 기능 설명
^ 시작 문자열의 시작을 표시
$ 끝 문자열의 끝을 표시
. 문자 한 개의 문자와 일치
X-Men으로 시작되고 이후에
\d 숫자 한 개의 숫자와 일치
어떤 문자가 반복되더라도 좋다
\w 문자와 숫자 한 개의 문자나 숫자와 일치
\s 공백문자 공백, 탭, 줄바꿈, 캐리지리턴 문자와 일치 모든걸 외울 순 없다
자주 쓰이는 것 위주로..
\S 공백문자 제외 공백 문자를 제외한 모든 문자
* 반복 0번 이상 반복
+ 반복 1번 이상 반복
[abc] 문자 범위 [abc]는 a 또는 b 또는 c를 나타낸다.
[^abc] 문자 범위 [^abc]는 a, b, c가 아닌 어떤 문자
정규식
정규식 활용하기
• re모듈: 파이썬에서 정규 표현식을 처리하기 위한 내장 모듈
• Lab: 주어진 멀티라인 문자열에서 수강번호만을 추출하라

import re
text="""101 COM PythonProgramming
102 MAT LinearAlgebra
103 ENG ComputerEnglish"""

s = re.findall("\d+", text)
print(s) \d+ : 숫자가 1번 이상 반복

['101', '102', '103']


정규식
Lab

사용자가 입력한 패스워드를 검증하는 프로그램을 작성해보자


• 조건 import re
최소 8글자
password = input("패스워드를 입력하세요");
적어도 하나의 대문자 flag = 0
적어도 하나의 숫자 while True:
적어도 하나의 특수문자[_, @, $] if (len(password)<8):
flag = -1
break
elif not re.search("[a-z]", password):
flag = -1
break
elif not re.search("[A-Z]", password):
소문자는 하나 이상 flag = -1
포함되는 것으로 가정 break
정규식
Lab

사용자가 입력한 패스워드를 검증하는 프로그램을 작성해보자


• 조건 elif not re.search("[0-9]", password):
최소 8글자 flag = -1
적어도 하나의 대문자 break
elif not re.search("[_@$]", password):
적어도 하나의 숫자 flag = -1
적어도 하나의 특수문자[_, @, $] break
else:
flag = 0
print("유효한 패스워드")
break

if flag ==-1:
print("유효한 패스워드가 아닙니다.")

You might also like