본문 바로가기
Study/Python

[Python #4] File

by YOONAYEON 2021. 10. 7.
Stream

 

 

: cpu와 연결된 키보드, 마우스, 저장 장치, 네트워크 등 모든 주변 장치의 입력과 출력을 byte들의 흐름으로 생각하는 것 

 

 

- Standard stream

 * 기본적인 스트림들은 프로그래머가 생성하지 않아도 프로세스가 시작되면 자동으로 생성

 

이름 스트림 연결 장치 표준파일 넘버
stdin 표준 입력 스트림 키보드 0
stdout 표준 출력 스트림 모니터 화면 1
stderr 표준 오류 스트림 모니터 화면 2

 

 

파일 입출력

 

 

- 파일열기

open (파일경로, 모드)

 

* 프로그램이 생성한 정보를 영구적으로 저장하기 위해 파일에 기록

* 파일 입출력을 위해 파일 위치를 확인하고 버퍼를 준비하는 과정을 하는 것이 open 함수

* 파일경로 : 입출력 대상의 이름. 디렉토리 경로 포함해서 쓰거나 파일명만 넣을 경우 현재 디렉토리에서 찾음

* 모드 : 읽기, 쓰기, 추가 등 파일을 어떤 모드로 처리할 것인가 지정

 

모드 설명
r 파일 읽기. 파일이 없을 시 오류 발생
w 파일 기록. 파일이 이미 있으면 덮어씀
a 파일에 데이터 추가
x 파일에 기록하되 파일이 이미 있으면 실패

 

 

- 파일 쓰기

 

* open함수는 파일 입출력을 준비하고 파일 객체를 리턴

* 데이터를 기록할 때는 출력할 데이터를 인수로 전달하여 write메소드를 호출

* 파일을 다 사용한 후에는 꼭! close 메소드로 닫아 뒷정리를 수행

 

 

- 파일 쓰기 예시

f = open("test.txt", "wt" )	# test파일을 쓰기모드로 열기 (파일명만 주었으므로 현재 디렉토리에 생성)
f.write("연습하는 중입니다")
f.close()

 

- 파일 읽기 예시 1)

try:
	f = open("test.txt", "rt")	# 읽기모드로 열기
    text = f.read()		# 읽어오는 방법. 대용량 파일일 경우 메모리 초과될 수 있음
    print(text)			# 연습하는 중입니다
except FileNotFoundError:
	print("파일이 없습니다. ")
finally:
	f.close()		# 파일 닫기

 

- 파일 읽기 예시 2)

f = open("text.txt", "rt")
for line in f:		# 파일안에 한 줄씩 줄단위로 읽어오기
	print(line)
f.close()

 

 

- 파일의 입출력 위치 지정

seek(위치, 기준)

 

* 파일의 입출력 위치를 바꿔가며 파일의 원하는 부분에 자유롭게 접근하는 방식 (임의 접근)

* '기준'에서부터 '위치'만큼 떨어진 곳을 기준으로 함

 

- 입출력 예시

f = open("sample.txt", "rt")	# life sometime deceive you Don't ...
f.seek(12, 0)		# 파일을 열고 12byte를 건너뜀 (12번째 칸으로 간다)
text = f.read()		# 이 위치에서 읽기 시작
f.close()

* 영어는 1byte를 차지하므로 앞의 12글자가 빠지게 됨

* 임의 접근은 인코딩 방식이 가변적인 텍스트 파일에는 적용하기가 어렵다

 

 

- 파일 내용 추가

f = open("sample.txt", "at")	# append모드. 기존 내용 뒤에 덧붙임
f.write("\n가나다라")			# 개행한 뒤 다음 줄에 내용 덧붙임
f.close()

 

- 파일 입출력 시 주의사항

 * 파일 입출력이 끝나면 반드시 close함수로 닫아야 한다

 * 사실 굳이 닫지 않아도 프로그램 종료 시 자동으로 닫히지만 파일을 연속적으로 사용할 때는 꼭 닫아줘야 한다

 * 매번 파일을 사용하고 열 때마다 open과 close를 호출하는 것은 귀찮고 가끔 잊어버려 파일이 손상된다

 

 

- with 블록을 이용하자!

with open("sample.txt", "rt") as f:
	text = f.read()
print(text)

 

* with구문으로 파일을 열고 as구문으로 파일 객체에 대입한 후 with블록 내에서 파일을 사용

* with 블록을 벗어나면 파일이 자동으로 닫힘

* 입출력 중에 예외가 발생해도 파일은 반드시 닫힘

* 좀 더 세세하고 확실한 자원정리를 할 때에는 try-finally 구문을 사용하는 것이 정석

 

 

 

 

CSV Files (comma separated values format)

 

 

: 하나 이상의 필드를 쉼표로 구분한 text 데이터 및 text 파일

: 다양한 스트레드시트 프로그램 간에 데이터를 교환하고 변환하는데 사용

 

 

- CSV 읽기 1)

def read_csv(filepath):
	elements = []
    
    with open(filepath, 'r', encodig='utf-8') as fp:    # 읽기 권한으로 열기
    	data = fp.read()	# 파일열기
        rows = data.split("\n") # 레코드를 구분하여 리스트에 대입
        for r in rows:
        	fields = r.split(',') # 필드 구분
            elements = (fields[0], fields[1], fields[2], fields[3])		# 튜플로 생성
            elements.append(element)	# 가공 데이터 리스트에 추가하기
            
		return elements

 

- CSV 읽기 2)

import csv	# python에서 기본적으로 제공하는 csv모듈

def read_csv(filepath):
	elements = []
    with open(filepath, 'r', encoding = 'utf-8') as fp:
    	reader = csv.reader(fp)		# csv파일의 한 줄 단위 콜렉션 반환
        for row in reader:
        	element = (row[0], row[1], row[2], row[3])
            elements.append(element)
        
		return elements

 

 

- CSV 쓰기

import csv

def write_csv(filepath, element):
	with open(filepath, 'a', encoding='utf-8', newline = '') as fp:		# append모드
    	wr = csv.writer(fp)		# writer()는 writer객체 반환
        wr.writerow(element)	# element 리스트의 요소를 콤마로 구별하여 넣어줌

 

 

 

Excel 파일 (.xlsx)

 

 

: XML기반의 기본 Excel 파일 형식.

: 파이썬에서 액셀 데이터를 다루기 위해서는 외부패키지 설치 필요

 

 

- Excel 파일 읽기

시트객체['셀'].value
시트객체.cell(row = 행번호, column = 열번호).value

 

* 액셀 파일의 시트 안에 있는 셀에 접근하는 두가지 방법

 

 

- XLSX 파일 읽기 예시

from openpyxl import load_workbook

wb = load_workbook(filename = 'sample.xlsx')	# 액셀파일 불러오기
sheet = wb['Sheet']		# sheet 이름으로 불러오기
print(sheet['A2'].value)	# 특정 셀 값 출력

 

 

 

- Excel 파일 쓰기

시트객체['셀'] = 값
시트객체.cell(row = 행번호, column = 열번호, value = 값)

 

 

- XLSX 파일 쓰기 예시

from openpyxl import Workbook
from openpyxl.utils import get_column_letter

wb = Workbook()
filename = 'sample.xlsx'	# 워크북 이름

ws = wb.active		# 현재 활성화된 시트
ws.title = 'data' 	# 시트 이름 바꾸기

for r in range(1, 10):	# 파일의 1~9행에 순서대로
	ws.append(range(50))	# 셀에 0~49 채우기

ws2 = wb.create_sheet(title = 'pi') # 워크북에 'pi'라는 새로운 시트 생성
ws2['A2'] = 100		# 데이터 삽입

wb.save(filename)	# 저장

'Study > Python' 카테고리의 다른 글

[Python #5] Class, Module, Package  (0) 2021.10.31
[Python #5] Dictionary, Set, Collection  (0) 2021.10.10
[Python #3] String, List & Tuple  (0) 2021.10.05
[Python #2] Loop & Function  (0) 2021.09.23
[Python #1] 파이썬 기본 구조  (1) 2021.09.23