파이썬 프로그래밍를 읽고, 정리한 글입니다.
목차
· 파일 입출력
· 데이터를 파일로 저장
· 파일 데이터 읽기
· 파일에 새로운 자료 추가
· with 구문 사용하기
· pickle을 이용하여 객체로 파일 입출력하기
파일 입출력
· 파이썬은 지속해서 데이터를 보조기억장치에 파일로 저장하고, 읽을 때 open, close 함수를 사용한다.
· open 함수 사용법:
open(파일명, mode = '파일처리모드')
· 파일처리모드의 종류:
처리 mode | 기능 설명 |
r | 읽기: 파일로 저장된 자료를 읽을 떄 사용 |
w | 쓰기: 파일에 자료를 쓸 때 사용 |
a | 추가: 파일 뒷부분에 자료를 추가할 때 사용 |
b | r, w, a는 텍스트 파일로 처리 / wv, rb는 바이너리 파일로 처리 |
· 파일 처리가 끝나고 오픈한 파일을 닫을 때는 close 함수를 사용한다. close()함수는 사용한 자원을 해제하는 역할을 한다. 오픈한 파일을 닫지 않으면 파일 처리가 정상적으로 되지 않을 수 있다.
TODO: open 함수의 추가적인 속성 ex) open(file, mode = 'r', buffering = None, encoding = None, encoding = None, errors = None, newline = None, ...)
데이터를 파일로 저장
· 특정 폴더에 데이터를 저장하려면 open 함수를 사용한다. open 함수는 파일 객체를 반환하는데 이를 변수에 치환하고, 해당 변수로 파일 처리 작업을 진행한다.
· 파일을 열었으면 파일 스트림을 이용해서 파일에 원하는 텍스트를 쓸 수 있다. 이때 사용하는 함수가 write 또는 writelines다.
· 파일 쓰기 방법:
변수 = open("경로명 및 파일명", mode = 'w', encoding = '문자열세트')
변수.write('문자열')
변수.writelines([리스트 자료...])
...
변수.close()
1. mode로 'w'를 사용해 파일을 쓰기 작업으로 open한다.
2. write 또는 writelines 함수로 파일에 텍스트를 쓴다.
3. 저장할 파일명이 이미 존재하면 원래 있던 파일의 내용이 모두 덮어쓰기 되고, 없으면 해당 파일명으로 보조기억장치에 저장된다.
obj = open("/Users/유저명/Desktop/test.txt",'w')
for i in range(1, 6):
data = "안녕 %d "%i
obj.write(data)
obj.write('\n')
obj.writelines(['ted', 'robin', 'marshall', 'lily'])
obj.close()
파일 데이터 읽기
· 파일 쓰기 과정:
변수 = open("경로명 및 파일명", mode = 'r', encoding = '문자열세트') # rmsid 'r'이라고 적어도 된다.
변수.read()
...
변수.close()
· open 함수로 파일을 읽는 방법:
1. line = obj.readline()
- 파일 스트림으로 해당 위치에서부터 한 줄의 문자열을 읽어온다. 즉 '\n' 개행이 있을 때까지 문자열을 읽는다. 반환 형식은 문자열이다.
2. lines = obj.readlines()
- 해당 위치에서부터 파일의 모든 문자열(개행 포함)을 읽어온다. 반환 형식은 리스트 자료형이다.
3. str = f.read()
- 파일의 전체 내용을 문자열로 읽는 방법이다. read(n)하면 파일 스트림으로부터 해당 위치의 문자 n개를 읽어온다. 반환 형식은 문자 n개의 문자열이다.
· 예시
data.txt
매일 사소한 습관의 반복이 만성적인 병을 만든다.
그와 마찬가지로 마음의 습관적인 반복이 영혼을 병들게도, 또 건강하게도 만든다.
하루에 열 번 주위 사람들에게 냉담한 말을 퍼부었다면
오늘부터는 하루에 열 번 주위 사람들에게 기쁨을 안겨주는 말을 건네 보라.
그러면 자신의 영혼이 치유될 뿐 아니라, 주위 사람들의 마음도 상황도 한결 나아질 것이다.
exam2.py
import os
try:
# 파일 내용 모두 읽기
letter = open(os.getcwd() + r'/data.txt', mode = 'r', encoding = 'UTF-8')
print(letter.read())
letter.close()
print()
# 파일의 일부분만 읽기
letter2 = open(os.getcwd() + r'/data.txt', mode = 'r', encoding = 'UTF-8')
for i in range(3):
line = letter2.readline()
print(line, end='')
letter2.close()
print()
# 리스트 자료형으로 모든 자료 읽기
letter3 = open(os.getcwd() + r'/data.txt', mode = 'r', encoding = 'UTF-8')
lines = letter3.readlines()
print(lines)
letter3.close()
except Exception as e:
print('파일 처리 오류:', e)
파일에 새로운 자료 추가
· 'a' 모드를 사용하면, 원래 값을 그대로 둔 상태에서 새로운 값을 기존 파일에 추가할 수 있다.
- 이미 생성된 파일에 'w' 모드를 사용하면 덮어쓰기가 진행된다.
변수 = open("경로명 및 새파일", mode = 'a', encoding = '문자열세트')
변수.write(data)
...
변수.close()
· 예시
try:
letter = open('data2.txt', 'w') # mode=는 생략
letter.write('빛은 어둠 속에서 더욱 밝게 빛난다.')
letter.write('\n')
letter.close()
letter = open('data2.txt', 'a') # 추가하기
letter.write('인간은 가혹한 환경 속에서 돼지처럼 살 것인지')
letter.write('\n')
letter.close()
letter = open('data2.txt', 'a') # 한 번 더 추가하기
letter.write('존엄성을 지키며 성자처럼 살 것인지 선택할 수 있다.')
letter.write('\n')
letter.close()
f = open('data.txt')
print(f.read())
f.close()
except Exception as e:
print('파일 처리 오류:', e)
with~as 구문 사용하기
· 컴퓨터에서 사용할 수 있는 리소스는 제한적이다. 따라서 파일 입출력과 관련된 처리가 끝나면 close()로 사용한 리소스를 종료해야 한다.
- 사용한 리소스가 사용 이후에도 계속 열려있는걸 자원 누수(resource leak)라고 한다.
· with~as 구문을 사용하면 파일 처리시 close()가 내부적으로 진행되어 명시적으로 close()를 쓰는 번거로움을 덜 수 있다.
· with~as 구문은 어떤 블록에 진입하고 나올 때 지정된 객체(컨텍스트 매니저)로 하여금 그 시작과 끝에 어떤 처리를 하도록 할 때 사용한다.
with 명령문 as 변수명:
...
· with~as 구문이 활용되는 상황
1. 파일 입출력
2. 네트워크 스트림을 다루는 소켓 프로그래밍
· with~as 구문 사용법:
with open('경로명 및 파일명', mode='처리모드', encoding='문자열세트') as 객체변수명:
객체변수명.읽기 또는 객체변수명.쓰기
· 예시 1
with open('data3.txt', mode='w', encoding='UTF-8') as f1:
f1.write('1등이 될 수 없다면 1등과 싸워 이기는 방법밖에 없다.')
f1.write('\n1등과 싸워 이길 수 있는 첫 번째 방법은 단기적인 목표 달성이 아니라 장기적인 체계를 갖추는 것이다.')
f1.write('\n장기적인 체계를 갖추다 보면 2등을 해도 뭔가 얻을 것이 있는 성공이 가능하다.')
with open('data3.txt', mode='r', encoding='UTF-8') as f2:
print(f2.read())
- 이와 같이 with~as 구문으로 파일 저장을 위한 코드를 작성하면, 별도의 close가 없더라도 코드 블록을 빠져나올 때 컨텍스트 매니저에 의해 자동으로 close()가 수행된다.
· 예시 2 - 정규표현식을 사용하여 파일 내의 특정 문자열 변경하기
import re
def replaceFunc(fname, source, target):
with open(fname, mode='r', encoding='UTF-8') as f3:
ss = f3.read()
ss = re.sub(source, target, ss) # 변경 작업(정규표현식)
return ss
result = replaceFunc('data3.txt', '1등', '꼴등')
print(result)
pickle을 이용하여 객체로 파일 입출력하기
· pickle 모듈은 파이썬이 제공하는 표준 모듈로 모든 파이썬 데이터 객체를 저장하거나 읽을 수 있다.
- 즉, 리스트나 클래스 객체처럼 텍스트가 아닌 자료형을 파일에 저장하거나 불러올 수 있다.
· pickle 모듈 사용법:
- 모듈을 import하고, 다음 형식을 따른다.
파일로 저장: pickle.dump(객체, 파일)
파일 읽기: pickle.load(파일)
· 피클링은 텍스트 상태의 데이터가 아닌 객체 자체를 파일로 저장하는 것으로, 다음과 같은 작업을 쉽게한다.
1. 객체 형태로 보조기억장치에 저장 기능
2. 데이터베이스 사용 기능
3. 네트워크를 통해 다른 컴퓨터에 전송 기능
· 언피클링은 load 함수로 피클링 과정을 반대로 수행하는 것이다.
- 즉, 객체로 저장된 데이터를 꺼내서 원래의 객체 형태로 다시 메모리에 로딩한다.
· 예시
import pickle
with open('test.pickle', 'wb') as fobj:
phones = {'ted':'010-0000-0000', 'robin':'010-0000-0001'}
devices = ['마우스', '키보드']
obj = (phones, devices) # 복합 객체 생성
pickle.dump(obj, fobj) # 복합 객체를 저장, 피클링
pickle.dump(devices, fobj) # 리스트 객체를 저장, 피클링
with open('test.pickle', 'rb') as fobj:
a, b = pickle.load(fobj) # 언피클링
c = pickle.load(fobj)
print(a)
print(b)
print(c)
'파이썬' 카테고리의 다른 글
[Python] pytest를 통한 파이썬 테스트 (feat. fixture) (2) | 2022.04.20 |
---|---|
[Python] 파이썬의 가상환경 pyenv (0) | 2022.04.14 |
[Python] 파이썬의 스레드 사용 (0) | 2022.04.10 |
[Python] 파이썬에서 예외를 다루는 방법 (0) | 2022.04.09 |
[Python] 파이썬과 객체 지향 프로그래밍 (3) | 2022.03.30 |
댓글