1. 대량의 데이터를 얻을 수 있는 방법1
2. import os로 로딩해줘야 함
3. 파일 생성
(1) 내장함수 open()을 사용하여 파일 생성
(2) 형식:
파일 객체명 = open(‘파일이름.확장자’, mode = ‘파일 열기 모드’, [encoding = ])
(3) 파일열기 모드
1) r: 읽기모드
① 파일을 읽기만 할 때 사용
② default값 => 생략 시 읽기모드
2) w: 쓰기모드
① 파일에 내용을 쓸 때 사용
② 기존에 있던 내용은 사라지고 새로 써진다.
③ 파일이 없다면 새로 생성되고 써진다.
3) a: 추가모드 – 파일의 마지막에 새로운 내용을 추가할 때 사용
4. 사용했던 자원 해제: 파일객체명.close()
① 생략가능
② 쓰기모드로 열었던 파일을 닫지 않고 다시 사용하려면 오류 발생
③ 직접 파일은 닫아줘야 함. 열었으면 닫아 주기
5. 쓰기모드로 열었을 때 출력 값 적는 방법
(1) 파일객체명.write(내용) – 파일에 작성됨
(2) print(내용) – 콘솔에만 작성됨
(3) csv파일 쓰기: csv.writer(fw).writerow(row)
import random
def calc_bmi(h, w):
bmi = w/(h/100)**2
if bmi < 18.5: return 'thin'
if bmi < 23: return 'normal'
return 'fat'
print(calc_bmi(170, 65))
fp = open('bmi.csv', 'w')
fp.write('height,weight,label\n')
cnt = {'thin':0, 'normal':0, 'fat':0}
for i in range(50000):
h = random.randint(150, 200)
w = random.randint(35, 100)
label = calc_bmi(h, w)
cnt[label] += 1
fp.write('{0},{1},{2}\n'.format(h, w, label))
fp.close()
print('good') # 파일이 성공적으로 생성되면 실행되는 문장
6. 읽기모드로 열었을 때 외부에 저장된 파일을 읽는 방법
(1) 파일객체명.readline()사용
1) 첫 번째 줄을 읽는 함수
2) 모든 내용을 읽으려면 while True: 무한루프로 읽어야 함, 읽을 줄이 없으면 break
3) 더 읽을 줄이 없으면 None반환
ex) while True:
line = f.readline()
if not line: break
print(line)
(2) 파일객체명.readlines()사용: 파일의 모든 줄을 읽어서 리스트로 반환
(3) 파일객체명.read()사용: 파일 내용 전체를 문자열로 반환
7. 추가모드로 열었을 때 파일에 새로운 내용 추가
(1) 원래 있던 내용을 유지하면서 마지막에 새로운 내용을 추가
(2) ‘a’모드로 열고 write(내용)함수를 사용하면 된다.
# file I/O (Input/Output)
import os
print(os.getcwd())
try:
print('파일열기')
# mode = 'r'(읽기모드)는 default값 - 안써줘도 됨
f1 = open(r'ftest.txt', mode = 'r', encoding='utf-8')
print(f1)
print(f1.read())
f1.close() #파일은 반드시 닫아줘야함. 사용했던 자원 해제, 열었으면 닫아주기
print('파일로 저장')
# mode = 'w'(쓰기모드)
f2 = open(r'ftest2.txt', mode = 'w', encoding='utf-8')
f2.write('내친구들\n')
f2.write('홍길동, 신기해, ')
f2.write('홍삼, 신선해')
f2.close()
print('저장성공')
print('파일 내용 추가')
# mode = 'a'(추가모드 - append)
f2 = open(r'ftest2.txt', mode = 'a', encoding='utf-8')
f2.write('\n손오공\n')
f2.write('조조')
f2.close()
print('추가성공')
print('파일열기')
f3 = open(r'ftest2.txt', mode = 'r', encoding='utf-8')
print(f3)
print(f3.read()) #전체 행 읽기
# print(f3.readline()) # 한 행씩 읽기 - for문 사용
f3.close()
except Exception as e:
print('에러: ',e)
8. with문
(1) with문을 벗어나는 순간 열린 파일 객체를 자동으로 close()실행한다.
(2) 형식:
with open(‘파일이름.확장자’, mode = ‘파일 열기 모드’, [encoding = ]) as 파일객체명:
print('\n--with문 사용 - close()를 자동수행-------------')
try:
# 저장
with open(r'ftest3.txt', mode = 'w', encoding='utf-8') as ff1:
ff1.write('파이썬 문서 저장\n')
ff1.write('어쩌고 저쩌고\n')
ff1.write('with문을 사용하니깐 close()를 하지 않음\n')
#읽기
with open(r'ftest3.txt', mode = 'r', encoding='utf-8') as ff2:
print(ff2.read())
except Exception as e2:
print('허걱에러: ',e2)
9. 복합 개체 처리 - pickle모듈 사용
(1) import pickle로 로딩해야 함
1) 리스트나 클래스 같은 텍스트가 아닌 자료형을 파일로 저장하기 위해 사용하는 모듈
2) 파이썬 객체 구조를 직렬화 및 역직렬화 하는데 사용하는 모듈
3) 메모리의 객체를 디스크에 저장하거나 네트워크를 통해 전송할 수 있는 바이트 스트림(Byte Stream)으로 변환 - .bin확장자로 저장하는 것을 권장
4) 바이너리(Binary)형태로 저장되고 불러오기만 하면 되므로 속도가 빠름
5) Boolean, Integer, Float, String, Tuple, List, Set, Dictionary유형이 객체를 pickle할 수 있다.
(2) 쓰기모드: wb
1) open()에서 mode = ‘wb’로 입력
2) pickle.dump(저장대상, 파일객체명)
(3) 읽기모드: wr
1) open()에서 mode = ‘wr’로 입력
2) pickle.load(파일객체명)
print('\n--피클링 - 복합 개체 처리(I/O)----------')
import pickle
try:
dicData = {'tom':'111-1111', 'james':'222-2222'}
listData = ['마우스', '키보드']
tupleData = (dicData, listData) # 복합객체
#binary방식으로 저장, w: write
with open('hi.dat', 'wb') as fobj:
pickle.dump(tupleData, fobj)
pickle.dump(listData, fobj)
print('객체를 파일로 저장하기 성공')
print('객체 읽기')
#binary방식으로 저장, r: read
with open('hi.dat', 'rb') as fobj2:
a, b = pickle.load(fobj2)
print(a)
print(b)
c = pickle.load(fobj2)
print(c)
except Exception as e3:
print('처리오류: ',e3)
종합 예제)
# 동 이름으로 우편번호와 주소 출력
try:
dong = input('동 이름 입력: ')
print(dong)
with open(r'zipcode.txt', mode = 'r', encoding = 'euc-kr') as f:
#print(f.read())
line = f.readline()
while line: #한줄 읽었는데 자료읽으면 while블럭에 문장들 실행, 또 다음문장읽고 있으면 또 문장들 실행....
lines = line.split('\t') #탭을 기준으로 구분되어 있어서
#print(lines) #['135-806', '서울', '강남구', '개포1동 경남아파트', '', '1\n'] =>3번째 동이름 이용(0번부터 시작)
if lines[3].startswith(dong): #입력된 동 이름으로 시작되는 주소만 작업에 참여
print('['+lines[0]+']' + ' ' + lines[1]+ ' ' + \
lines[2]+ ' ' + lines[3]+ ' ' + lines[4])
# 한 줄이 너무 길면 \적고 enter하면 계속 이어짐
line = f.readline()
except Exception as e:
print('err: ', e)
10. from io import StringIO
외부에서 텍스트 내용을 가져올 때 이를 파일로 만들기위해서 메모장에 붙여넣기를 하고 txt파일로 저장하거나 csv파일로 저장하는 작업을 StringIO()를 이용해서 바로 파일로 저장가능
10. 내장함수 (0) | 2021.04.29 |
---|---|
8. 사용자 입력과 출력 (0) | 2021.04.29 |
7-2. 클래스 (0) | 2021.04.25 |
7-1. 클래스 (0) | 2021.04.25 |
6. 모듈(module) (0) | 2021.04.25 |