본문 바로가기

Python

20210110_ Python 입문8,excel, csv 외부 파일 처리

Python 외부 파일 처리_ CSV, XSL, XLSX


1. CSV 파일 읽기 및 쓰기

  • CSV 파일은 보통 컴마로 구분 되어 있으며 MIME 타입이라고 한다.

  • csv 파일을 사용하기 위해서는 csv를 import 해야 한다.(python에 보통 csv 패키지가 기본으로 있음 pip로 설치할 필요는 없음)

1) CSV 파일 읽기 코드

  • 구분자가 ,인 경우(기본 list 형 반환)
import csv # 1. csv import 시켜준다. 함수 호출시 csv 까지 이름을 붙여 호출해줘야함
with open('./resource/sample1.csv', 'r') as f: 
# 2. with 구문으로 csv파일을 read(읽기)모드로 open해 주며 alias를 f로 지칭
    reader = csv.reader(f) # 3. reader 변수에 csv.reader함수를 통해 파일을 읽어 할당한다. (함수가 더 궁금하면 csv를 dir을 보자)
    print(reader) # 4. reader 변수를 출력하자 object 코드가 뜬다.
    print(dir(reader)) # 5. reader의 dir을 보자 __iter__가 있음을 확인

    for c in reader: # 6. iter이므로 바로 for문에 적용
        print(c) # 하나의 줄(raw)을 list 형태로 출력       
  • 구분자가 특정한 것인 경우(기본 list 형 반환)
with open('./resource/sample2.csv', 'r') as f:
    reader = csv.reader(f, delimiter='|')
# 1. reader 함수 옵션으로 delimiter(구분문자)를 지정하여 어떻게 원소로 구분할지 지정할 수 있다.
# 2. 그 외엔 위와 같이 한다.
  • dict 형으로 반환
with open('./resource/sample1.csv', 'r') as f: # 1. 이전과 똑같이 파일 open
    reader = csv.DictReader(f) 
    # 2. DictReader 함수 사용 : 헤더(필드)랑 연결시켜서 dict 형으로 읽어옴 (헤더 가장 윗줄 반환하고 점차 한줄씩 내려감 보통 헤더에 필드를 넣는 편이라 필드값임)

    for c in reader: # 3.  dict 형으로 반환 된 것을 한줄씩 가져오는 것
        for k, v in c.items(): # 4. 가져온 한줄을 items 함수 사용하여 key 와 values를 한번 씩 가져옴
            print(k, v)
        print('-----------')

2) CSV 파일 쓰기 코드

  • writerow 함수

한줄씩 작성

import csv
w = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
# 1. 쓸 내용 이중 리스트로 w에 지정
with open("./resource/sample3.csv", 'w', newline='') as f: 
# 2. open의 3번째 매개변수 옵션의 기본 옵션(없을시)은 기본으로 새로운 라인이 생기면 엔터를 친다는 것. 근데  newline='' 으로 해두면 '\n' 개행이 없는 것으로 됨
    wt = csv.writer(f) #  현재 csv 패키지 import 상태라서 csv 패키지 까지 찍어주고 . writer함수사용

    for v in w:         # 순회하면서 작성
        wt.writerow(v)  # writerow한줄씩 작성하고 작성하면서 개행은 자동으로 들어감

  • writerows 함수

순회 안하고 모두 한번에 작성

import csv
w = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
with open("./resource/sample4.csv", 'w', newline='') as f: 
    wt = csv.writer(f)      
    wt.writerows(w)  # 한번에 작성



2. 엑셀(Xlsx,Xsl) 등의 파일 처리

1) 엑셀 파일 처리를 위한 환경설정

  • 엑셀 처리하는 오픈 소스는 openpyxl, xlweriter, xlrd, xlwt, xlutils 등이 있다.

  • 주로 pandas를 사용한다.(openpyxl, xlrd를 내부적으로 사용하기 때문)

  • 환경설정

  일단 가상환경 터미널(activate 된 cmd)에서 pip install xlrd, pip install openpyxl , pip install pandas 하면 됨

2) 환경 설정 중 VScode , Python 환경에서 pandas import error 발생

  • pip 를 통해서 라이브러리 3개를 설치하고 pandas를 import 하였으나 계속 padas를 못찾는 에러가 발생했다.

  • 분명히 install 도 잘되었고 파일도 존재하는데 찾질 못한다. (패키지 이름까지 불러줘도 못찾음)


3. 엑셀 파일 읽기

  • pandas의 read_excel함수의 옵션(filename, sheet_name, header, names, index_col, usecols, dtype, skiprows, nrows, na_values, thousands)
  • sheet_name: 0, 1, 2 .. (시트 인덱스), list 형으로 가능 [0,"sheet2"]
  • header : 필드가 어디 있는가 지정 기본값은 첫번째 줄 None = 첫번째 줄 부터 바로 데이터 받음
  • names : 헤더가 none 일 경우 열의 이름을 지정 해줌
  • skiprows : 엑셀 읽을때 첫줄로 부터 몇줄 건너뛸지 지정
  • nrow : 몇줄 읽을지 지정
import pandas as pd # 1. pandas import 하고 pd로 alias줌 
xlsx = pd.read_excel('./resource/sample.xlsx') # 2. xlsx 변수에 pd의 read_exel 함수를 이용하여 파일을 반환하였다.  약간 open 함수를 포함하는 느낌이다.
  • 상위 데이터 확인 : xlsx.head()

  • 하위 데이터 확인 : xlsx.tail()

  • 데이터 행,열 모양 확인 : xlsx.shape()

4. 엑셀 파일 쓰기

xlsx = pd.read_excel('./resource/sample.xlsx')
xlsx.to_excel('./resource/result.xlsx', index=False) #  index 옵션은 다시 쓰여진 파일에 인덱스를 넣을지 말지
# sample 파일을 읽어서 result 엑셀 파일로 작성 
xlsx.to_csv('./resource/result.xlsx', index=False)
# sample 파일을 읽어서 result CSV 파일로 작성