Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

BASEMENT

Python 3주차 - 2 본문

Programming/Python

Python 3주차 - 2

2_34 2020. 7. 12. 17:32

 

파일 입출력

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