BASEMENT
Python 3주차 - 2 본문
파일 입출력
1. 파일 입출력 개념
1) 용어
- 표준입력 : 키보드 입력, input()
- 표준출력 : 화면에 출력, print()
- 콘솔(console) : 키보드와 화면을 합친 용어
2) 파일 입출력 기본 과정
- 파일 열기 : <파일객체> = open(문자열:파일경로, 문자열:열기모드, <encoding='UTF-8'>)
- 파일 처리
- 파일 닫기 : <파일객체>.close()
cf) 파일 열기
w : write 모드 (새로쓰기모드, 덮어쓰기)
a : append 모드 (이어쓰기)
r : read 모드 (읽기). 생략시 default 값
read_file = open("test.txt", "r", encoding="utf-8")
line_total = read_file.read()
print(line_total)
read_file.close()
2. 텍스트 파일 입력
read(), readline(), readlines()
1) 텍스트 파일 입력 코드 절차
- 키보드 입력 대신, 입력 내용이 작성된 파일 생성
- 메모장에다 입력 내용 작성, 텍스트 파일로 저장
- 파일 열기함수(open)의 파일 이름 및 위치 설정 시, 저장 위치가 현재 작성중인 파이썬 파일과 동일하면 "텍스트파일 이름" / 저장위치가 현재 작성중인 파이썬파일 폴더 내 다른 폴더라면 "./다른폴더명/텍스트파일이름" / 저장위치가 전혀 다른 위치라면 " 드라이브명:/폴더이름/../텍스트파일이름
2) readline()
한 행씩 읽어 들임
openFp = None
inStr = ''
openFp = open("test.txt", "r", encoding="utf-8")
while True:
inStr = opnFp.readline() # 한줄씩 읽음
if inStr == '': # 내용이 없으면
break # 무한반복 중지
print(inStr, end='')
openFp.close()
3) readlines()
한 번에 라인별로 모두 읽어 리스트에 저장
openFp = None
inList = []
openFp = open("test.txt", "r", encoding="utf-8")
inList = openFp.readlines()
print(inList)
openFp.close()
4) read()
openFp = None
openFp = open("./test.txt", "r", encodint="utf-8")
readLine = openFp.read() # readLine의 타입은 <class str>
print(readLine)
openFp.close()
5) 파일이 없을 때 오류 발생 금지 코드
os.path.exists(파일이름) 사용
import os
openFp = None
fileN, inStr, inList = '', '', []
fileN = input("파일명 입력 >> ")
if os.path.exists(fileN):
openFp = open(fileN, "r", encoding="utf-8")
inList = openFp.readlines()
for inStr in inList:
print(inStr, end='')
openFp.close()
else:
print("%s 파일이 존재하지 않음" % fileN)
6) os 모듈의 사용
- os.getcwd() : 현 위치 가져오기
- os.listdir() : 현 위치에 존재하는 파일내용 확인
- os.path.isdir() : 현 위치에 있는 내용이 디렉토리인지 확인
7) glob 모듈
- 폴더 내 파일들의 목록 활용 시 사용
- glob.glob('*.txt'), glob.glob('*'), glob.glob('file.*') 등
- 목록들은 리스트로 저장됨
# 현재 작성 중인 파이썬 파일의 위치와 동일하게 저장된 .txt의 모든 파일의 내용을 출력
import glob
infile = glob.glob('*.txt')
print(infile)
for name in infile:
f = open(name, 'r', encoding='utf-8')
print(f.read())
f.close()
3. 텍스트 파일 출력
1) 파일을 통한 출력
- write() : 문자열만 출력
- writelines() : 문자열 외에도 리스트형식의 데이터 출력 가능
- open() 함수에서 모드는 "w" 와 "a" 사용
- "w" : 기존 파일이름을 사용하면 덮어쓰기 (기존파일 삭제) / 새로운 파일이름을 사용하면 파일 생성 및 쓰기 기능
- "a" : 기존 파일이름을 사용하면 이어쓰기 (기존파일 존재) / 새로운 파일이름을 사용하면 파일 생성 및 쓰기 기능
openFp = None
OutStr = ''
openFp = opne("test.txt", "w", encoding="utf-8")
while True:
outStr = input("내용입력 : ")
if outStr != '':
openFp.writelines(outStr + "\n")
else:
break
openFp.close()
2) 이진 파일 입출력
- 이진은 글자가 아닌 비트 단위로 의미가 있는 파일
- 텍스트 파일을 제외한 모든 파일 (그림, 음악, 동영상, 엑셀 등)
- 파일이나 네트워크 연결에 저장된 바이너리 데이터 처리 시 필요
file = open('b.txt', 'wb') # wb : 바이너리 파일 write
while True:
line = input("input >> ")
file.write(line.encode('utf-8') + b'\n')
if line == '':
break
file.close()
file_ = open('b.txt', 'rb') # rb : 바이너리 파일 read
line = file_.read().decode('utf-8')
print(line)
flie_.close()
3) Pickle 모듈 사용
- 텍스트 아닌 데이터의 파일 입출력 시 사용 (이진 파일 등)
import pickle
f = open('file.dat', 'wb')
pickle.dump('hello python', f)
pickle.dump(12345, f)
pickle.dump(123.12345, f)
pickle.dump(['hi','hello','bye'], f)
f.close()
read_f = open('file.dat', 'rb')
line = []
while True:
try:
line.append(pickle.load(read_f))
except EOFError:
break
read_f.close()
print(line)
cf) 인코딩 (encoding)
- 파이썬의 기본적인 인코딩은 ASCII
- 영문자 또는 한글 등은 기본적으로 <class str> 이며 str이 기계어, 즉 bytes로 변환 될 때, 단일의 bytes로 변환됨 ex) han = "가" 인 경우 bytes는 'xb0xa1'으로 len() = 1
- 문자열을 utf-8로 인코딩하는 경우 타입은 <class bytes>이며, utf = han.encode('utf-8')인 경우의 bytes는b'\xea\xb0\x80' 으로 3개의 bytes로 나뉘어져 있음. 즉 len() = 3
- 즉, 파이썬에서 ASCII 코드로 기계화된 문자열을 utf-8로 인코딩 시켜 정상 출력시켜줌
4. File 객체의 특징
1) iterable 객체
- 파일을 open하면 iterable 객체인 handle 제공
- range 함수 객체처럼 1회성 사용
2) Context Manager 객체 -> with 구문 사용
- 컴퓨터의 제한적인 리소스 관리를 위해 사용되는 객체
- with 문을 지원하기 위한 객체가 따라야 하는 간단한 프로토콜 또는 인터페이스
- 객체 내 Magic Methods 중 __enter__, __exit__가 포함된 경우
- __enter__(self) : with 구문에 진입하는 시전에서 자동 호출 메소드
- __exit__(self, type, value, trackback) : with 구문을 빠져나오기 직전에 호출되는 메소드. type, value, trackbacke은 with 구문을 벗어나기 전에 발생되는 예외에 대한 정보를 나타냄
with open("hello.txt", "r") as f:
text = f.read()
# open을 사용해서 열 때
f = open("hello.txt", "r")
text = f.read()
f.close()
class ManagedFile:
def __init__(self,name):
self.name = name
def __enter__(self):
self.file = opne(self.name, 'w')
return self.file
def __exit__(self, exc_type, exc_Val, exc_tb):
if self.file:
self.file.close()
with ManagedFile('exam.txt') as file: # __enter__ 호출
file.write('hello, python' + '\n')
file.write('bye bye')
# __exit__ 호출
3) with 역할
- 파일 오픈에 해당되는 open()은 반드시 close()를 작성해야 함
- 종료에 해당되는 함수작성을 생략 시, 메모리 누수 등이 발생하기 때문
- with를 사용하면 자동으로 종료 되므로 close()를 작성할 필요가 없음
5. 예외처리
오류 발생 시, 파이썬 처리 대신 프로그래머가 작성한 코드를 실행
try:
실행문
except:
오류 발생시 실행문
def divide(n,m):
return n/m
try:
n= int(input("Enter integer1>> "))
m = int(input("Enter integer2>> "))
print(divide(n,m))
except:
print("Division by Zero, m")
with 구문으로 파일을 불러올 때 예외처리
try:
with open("./data/try_except.txt", "r") as file:
line_one = file.read()
print(line_one)
except:
print("./data/try_except.txt 파일이 없습니다")
반복문 예외처리
items = ['a','b','c','d','e','f']
count = len(items)
i=0
try:
while i < count:
print(items[i])
i += 1
except:
print("List index out of range")
오류 종류별로 처리 가능
- ImportError : Import문에서 오류
- IndexError : 리스트 등 첨자 오류
- KeyError : 딕셔너리의 키 오류
- KeyboardInterrupt : 프로그램 실행 중 Ctrl+C 입력 시
- NameError : 변수명 오류
- RecursionError : 재귀호출횟수가 시스템 설정범위를 벗어날 때(1000번)
- RuntimeError : 실행 오류
- SyntaxError : 문법상 오류
- TypeError : 변수형 오류
- ValueError : 함수 매개변수 오류
- ZeroDivisionError : 0으로 나눌 때
- IOError : 파일처리 오류
# 예제 - 오류종류별 예외처리
num1 = input('number1: ')
num2 = input('number2: ')
try:
num1 = int(num1)
num2 = int(num2)
while True:
res = num1/num2
except ValueError:
print('숫자형태문자열만 숫자로 변환할 수 있습니다')
except ZeroDivisionError:
print('0으로 나눌 수 없습니다')
except KeyboardInterrupt:
print('Ctrl + C를 눌렀습니다')
try, <except>, <else>, <finally>
- try 문에서 오류 발생시, except문 실행
- try 문에서 오류가 발생되지 않으면, else문 실행
- finally 문은 오류발생여부에 관계없이 무조건 실행
- try는 필수, 나머지는 선택사항
num1 = input('number1: ')
num2 = input('number2: ')
try:
num1 = int(num1)
num2 = int(num2)
except ValueError:
print('오류 발생')
else:
print(num1, "/", num2, "=", num1/num2)
finally:
print('무조건 실행되는 구문')
'Programming > Python' 카테고리의 다른 글
Python 4주차 - 2 (0) | 2020.07.12 |
---|---|
Python 4주차 - 1 (0) | 2020.07.12 |
Python 3주차 - 1 (0) | 2020.07.12 |
Python 2주차 - 2 (0) | 2020.07.11 |
Python 2주차 - 1 (0) | 2020.07.11 |
Comments