[python] 파일 입출력

·2024년 10월 10일

just공부

목록 보기
6/42

CSV Files

  • comma separted values format
  • 하나 이상의 필드를 쉼표로 구분

CSV 파일 읽기 (1)


def read_csv(filepath):
	elements = []
  
  	fp = open(filepath, 'r', encoding = 'utf-8) # 한글 있는 파일이면 인코딩 필수
  	data = fp.read() # 파일 열기
  	fp.close()
 
 	rows = data.split("\n") # 레코드 먼저 구분하여 리스트에 대입
	for row in rows:
    	fields = row.split(',) # 필드 구분
    	element = (fields[0],fields[1],fields[2],fields[3]) # 튜플로 만들기
    	elements.append(element) # 만든 데이터를 리스트에 매달기
	return elements
    
filepath = 'data.csv'
elements = read_csv(filepath)
for element in elements:
	print("element : \n", element)

위의 코드를 실행했을 때 list-index out of range라는 에러가 발생함
-> rows 의 len을 찍어보니 csv파일의 내용보다 한 줄 많이 찍혔고, print해보니 빈 문자열이 마지막에 찍혀있음을 알게 되었다

해결방법은 반복문 안에 if not rows.strip() : continue 를 추가해주었다.
공백이 아닐 경우에만 아래의 코드가 실행되도록 해줌으로써 에러를 해결할 수 있었다.

#!/usr/bin/python3

def read_csv(filepath):
	elements = []
	try:
		f = open(filepath, 'r', encoding='UTF-8')
		data = f.read()
	except:
		print("error")
	finally:
		f.close()
	
	rows = data.split('\n') # rows는 collection, \n으로 기준
	
	for row in rows:
		if not row.strip():
			continue
		fields = row.split(', ')
		element = (fields[0], fields[1], fields[2], fields[3]) # tuple로 만들기, list를 tuple로 변환한 것
		elements.append(element) # element를 리스트에 매달기
	return elements # str 네 개짜리 collection이 됨


filepath = 'data.csv'
elements = read_csv(filepath)
for element in elements:
	print("element : \n", element)

위의 코드는 해결한 코드이다.

CSV 파일 읽기 (2)

import csv # python에서 기본적으로 제공하는 csv 모듈을 사용할 수도 있음
def read_csv(filepath):
	elements = []
	with open(filepath, 'r', encoding = 'utf-8') as fp:
		reader = csv.reader(fp) # reader 함수는 iterable한 reader 객체를 반환
		for row in reader: # 한 행을 list로 받아옴
			element = (row[0],row[1],row[2],row[3])
			elements.append(element)
	return elements
	
filepath = 'students.csv'
elements = read_csv(filepath)
for element in elements:
print( "Id: {}, major: {}, name: {}, advisor: {}".format(element[0],element[1],element[2],element[3]))
  • with 으로 파일 종료를 잊지 않고 해줄 수 있음
  • reader = csv.reader(fp) : 1줄씩 읽어서 리스트로 읽을 수 있음

CSV 파일 쓰기

import csv

def write_csv(filepath, element):
	with open(filepath, 'a', encoding='UTF-8', newline='') as fp:
    	wr = csv.writer(fp)
        wr.writernow(element)
        
filepath = 'students.csv'
row = input("Input your id, major, name and advisor : ")
element - row.split()
write_csv(filepath, element)
  • 'r' : 파일을 읽음, 파일이 없으면 예외 발생
  • 'w' : 파일에 기록, 파일이 이미 있으면 덮어씀
  • 'a' : 기존의 파일에 덧붙임 (append)
  • 'x' : 파일에 기록하되, 존재하는 파일이 있으면 실패

Excel 파일 입출력

XLSX 다루기

from openpyxl import Workbook # openpyxl 모듈의 Workbook 불러오기
wb = Workbook()

ws= wb.active # 활성 시트 불러오기
ws['A1'] = 42 # 데이터를 셀에 직접 넣을 수 있음
ws.append([1,2,3]) # row 단위로 추가하는 것도 가능

wb.save('sample.xlsx') # Save file
  • value 함수를 통해 특정 셀의 값을 읽어올 수 있음
  • 셀을 가리키는 방법
    • 셀 이름 직접 주기
    • 셀의 행 번호와 열번호를 parameter로 주기

XLSX 파일 읽기

from openpyxl import load_workbook

wb = load_workbook(filename = 'sample.xlsx') # 엑셀 파일 불러오기
sheet_ranges = wb['Sheet'] # sheet 이름으로 불러오기
print(sheet_ranges['A2'].value) # 특정 셀의 값 출력
  • sheet_ranges 는 파일 안의 여러 sheet가 존재할 때 sheet의 title이 됨
    • 'sample.xlsx' 에 'Sheet' 이름을 가진 sheet가 존재해야 함

XLSX 파일 쓰기

  • 시트객체['셀'] = 값

  • 시트객체.cell(row=행번호, column=열번호, value=값)

  • 수식을 사용할 때는 value에 값 대신 수식을 그대로 넣어주면 됨

-> 특정 셀에 값 입력하기

from openpyxl import Workbook
from openpyxl.utils import get_column_letter

wb = Workbook()
dest_filename = 'empty_book.xlsx'

ws1 = wb.active # 첫 sheet (default sheet)
ws1.title = 'range names' # change sheet name

for row in range(1, 10): # 1~9행에 0~49 채우기
	ws1.append(range(50))

ws2 - wb.create_sheet(title = 'Pi') # 'Pi' sheet 생성
ws2['F5'] = 3.14 # insert data

for row in range(3, 7): # 3~6행
	for col in range(5, 15) # 5~14열에 열에 해당하는 알파벳 넣기
    	ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
print(ws3['K5'].value) # 특정 셀의 value 출력

wb.save(filename = dest_filename)
profile
Whatever I want | Interested in DFIR, Security, Infra, Cloud

0개의 댓글