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)
위의 코드는 해결한 코드이다.
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줄씩 읽어서 리스트로 읽을 수 있음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' : 파일에 기록하되, 존재하는 파일이 있으면 실패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
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가 존재해야 함시트객체['셀'] = 값
시트객체.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)