본문 바로가기
관/핫한 파이썬 공부

파이썬의 여러 모듈 공부하기 08.

by 4차원 박스 2019. 12. 16.

tkinter를 통해 위젯 등의 필요한 gui도구를 만들고
matplotlib 등을 통해 데이터를 시각화 해주었다(그래픽 이라함)
이번에는 어떻게 데이터를 처리하는지 알아볼것이다.

1. 파일을 주고받아서 처리함
2. DBMS를 통해 처리함 (데이터베이스를 이용한다는 의미 이다.) 오라클,mysql,sqlite(안드로이드에 대부분 설치되어 있다) 등등이 있다.


보조기억장치에서 프로그램이 메모리로 가면
프로세스가 되고 이 프로세스는 cpu의 queue로 가서 
일을 하게 된다(몇초간), 이렇게 몇초간 일을 하고 끝내고를 
반복하여 그 결과가 화면에 출력이 된다.

(보조장치(hdd,ssd 등)에 영구저장하는 방식이
파일과 dbms를 이용하는것이다.)

이제부터는 여러형식의 파일들을 어떻게 불러오고 사용하는지
또, 데이터베이스로 데이터를 직접 읽어오는 방식을 파악해본다.
간단한 룰을 익히도록 해본다.



1. txt파일 읽어서 데이터 처리하기

바로 예제로 본다


mport matplotlib.pyplot as plt

x,y,z = [],[],[]
for line in open('data.txt','r'):  #아무런 가공없이는 데이터의 1행단위로 본다
    value=[float(s) for s in line.split()]
    x.append(value[0])
    y.append(value[1])
    z.append(value[2])
plt.plot(x,y)
plt.plot(x,z)
plt.show()


같은 내용을 넘파이로 간단히 줄여볼수 있다.

data=np.loadtxt('data.txt')

plt.plot(data[:,0],data[:,1])
plt.plot(data[:,0],data[:,2])
plt.show()

이걸 data.T를 이용하는 방식은 다음과 같다

data=np.loadtxt('data.txt')
plt.plot(data.T[0],data.T[1])
plt.plot(data.T[0],data.T[2])
plt.show()

data.T 에서 T는 행이아닌 열 부터 읽게해준다.




2. csv 파일 읽어서 데이터 처리하기(엑셀과 비슷하다고 보면 편함),(저장할때 크기가 적어서 많이 사용된다.)

만드는방법은 엑셀에서 다름이름으로 저장할때 csv파일 형식으로 저장하면 된다.

참고로 다음 예제들에서 공통사항은 cvs파일을 , 를 통해 구분 한다는 것이다.(실제로는 ,가 안보이는 파일임에도)

예제로 바로 본다.

import csv
data=[]
x,y=[],[]

with open('data.csv') as f:
    reader=csv.DictReader(f)       #DictReader 로 타이틀 기준으로 읽을수 있다.
    data=[row for row in reader]

for datarow in data:
    print(datarow['day'],datarow['ammount'])   #여기서 인덱싱이 아니라 타이틀인 day와 ammount를 사용해야 오류가 나지 않는다.
    x.append(datarow['day'])   # datarow가 지닌 값중에 'day'에 속한 데이터만 불러들이는 역할을 한다.
    y.append(datarow['ammount'])

plt.plot(x,y)
plt.show()





다음과 같이 reader 를 사용할 수도 있다.(이건 타이틀을 빼내는 작업이 필요하다)

filename='data.csv'
data=[]
x,y=[],[]

try:                                     
    with open('data.csv', 'r') as f:
        reader=csv.reader(f)
        header=next(reader) #이거는 앞에 타이틀을 빼준다.
        data=[row for row in reader]
        
except csv.Error as e:
    print("Error reading csv file %s: %s" % (reader.line_num,e))
if header:
    print(header)
    print('======')

for datarow in data:
    print(datarow)
    x.append(datarow[0]) #이것을 인덱싱으로 처리한다는점에서 DictReader와 reader의 차이점이 나타난다.
    y.append(datarow[1])

plt.plot(x,y)
plt.show()


일반적으로 파일을 입출력시 예외 처리가 필요하다 이를 exception handling 이라 한다
에러가 발생하면 프로그램을 종료하지 않고 다른 내가 정한 이것을 실행 하라고 하는 코드이다.

이를 처리하는 코드는 파이썬에서 try-except 코드로 사용한다.

(참고로 대표적인 에러는 devide by zero 이다 (나누기 에서 분모가 0일때 나타나는 에러))



next라는 함수는 읽는 파일의 가장 첫 행을 읽어들이고, 이것이 헤더에 저장되면
기존에 전체데이터를 포함하고 있던 reader는 첫행 다음부터의 데이터 부터 가리키게 된다.


csv파일을 수정하는법


with open('data.csv', 'r', encoding='utf-8') as infile # 이건 기존에있는 csv파일, open('copy.csv','w', encoding='utf-8',newline='') as outfile: #이것이 복사될 파일임
    reader=csv.reader(infile)
    next(reader)
    writer = csv.writer(outfile)
    for row in reader:
        writer.writerow(row)

이 결과 
기존에 있던 'data.csv' 파일이 있는경로에 새로이 만든 파일인
'copy.csv'파일이 만들어진다.



넘파이로 csv 파일을 텍스트파일을 여는 방식으로 열기 
넘파이는 2차원 배열로 가져오고, csv파일은 보이진 않지만 콤마로 구분함을 이용

data=np.loadtxt('data2.csv',delimiter=',') #이것이 핵심

for col in data.T:
    plt.plot(data[:,0],col)

plt.show()



판다스 모듈을 이용하기 (이건 전체적으로 쉬워진다) 
import pandas as pd
data=pd.read_csv('data2.csv', skiprows=1) #판다스로 불러오는데 첫행 지우기
data.to_csv('data2copy.csv', index=False)# 판다스로 이거를 카피본으로 저장한다. index=False로 첫 행을 지우면서 저장시킴

이것 말고 여러방식으로 불러들이고 저장할 수 있다.



3. 엑셀파일로 직접 처리하기


(import xlrd 사용)
file='data.xlsx'
wb=xlrd.open_workbook(filename=file)
ws=wb.sheet_by_name('Sheet1')# 시트1을 불러온다

dataset=[]

for r in range(ws.nrows):
    col=[]
    for c in range(ws.ncols):
        col.append(ws.cell(r,c).value)
    print(col)
    dataset.append(col)

plt.plot(dataset[0],dataset[0])
plt.plot(dataset[0],dataset[1])
plt.plot(dataset[0],dataset[2])
plt.show()


(import openpyxl 사용 엑셀을 불러들여서 조작후 다시 저장하는 방식)

wb=openpyxl.load_workbook('data.xlsx')

ws=wb.get_sheet_by_name('Sheet1') #저장된게 무엇이든 시트1 얻어오기
#ws=wb.active #이거는 현재 저장된 시트를 불러오는 것임

for r in ws.rows:
    ri=r[0].row
    guk=r[1].value
    eng=r[2].value
    su=r[3].value
    sum=guk+eng+su
    
    ws.cell(row=ri,column=4).value=sum #더한 값을 새로운 행렬자리에 붙이는 코드
    print(guk,eng,su,sum)

wb.save('datasum.xlsx')  # 새로운 이름으로 저장하는것
wb.close()



4. 확장자 구분없이 일정한 형식을 지닌 데이터 읽어서 처리

import struct
import string

mask='9s14s5s' #이런 형식으로 읽을것임
datafile='sample.data' #이 파일은 데이터가 일정 덩어리로 스페이스로 구분됨
data=[]
with open(datafile, 'rb') as f: #바이너리형으로 읽겠다는 의미
    for line in f:
        fields=struct.Struct(mask).unpack_from(line)
        print('fields: ',[field.strip() for field in fields])
        data.append(fields)
print(data)

탭으로 구분된것으로도 할 수 있다.

5. json파일로 데이터 처리하기.


6. 넘파이 배열에 파일로 부터 데이터 읽어오기.

한결 여기 해보기
텍스트파일 = 문자만
바이너리파일 = 이미지,실행파일 등등

이미지 처리할때 많이사용하는 모듈: from PIL import Image


다음포스팅은 DBMS를 한다.

댓글