본문 바로가기

프로그래밍/Python

[요약] 파이썬(Python) - 엑셀(Excel)/CSV 파일 읽기 쓰기

[요약] 파이썬(Python) - 엑셀(Excel)/CSV 파일 읽기 쓰기


엑셀을 위한 파이썬 라이브러리 설치

# pip install xlrd
# pip install openpyxl
# pip install pandas


** Microsoft Visual Studio Code를 이용하여 편집할 경우 다음과 같은 문제가 발생했다.

pandas 설치 후 pip list 로 확인 했을 때에는 "pandas" 모듈이 설치 된것으로 보이는데

파이썬 파일 실행시 "ModuleNotFoundError: No module named 'pandas'" 오류가 

"import pandas as pd" 라인에서 발생하는 경우가 있다


pandas가 설치 되어 있는데 ModuleNotFoundError: No module named 'pandas' 오류로 pandas 모듈이 import되지 않을 때 처리 방법

   python 소스 경로의 scripts 디렉토리에서 activate된 상태의 command창에서 

   pip를 이용하여 Module을 실행할 경우에 "pandas" 모듈을 찾지 못하는 경우가 발생한다.

   이때에는 새로운 command창(도스창)을 새로 열어서 위 명령을 실행하면 정상적을 pandas 모듈을 인식한다.


엑셀 및 CSV 파일을 읽고 쓰기 위한 실용 코드 예제


# 파이썬 외부파일 처리
# 엑셀(Excel), CSV파일 처리(읽기 및 쓰기)

# Excel파일의 형식 
# XLS, XLSX
# 엑셀 사용을 위한 패키지설치

# CSV : MIME Type - text/csv
# CSV파일의 필드 구분자는 기본이 콤마:"," 이지만 다른 문자를 사용할 수 있다

# 예제1)
import csv

with open('./resource/excel_sample1.csv', 'r', encoding='UTF-8') as f:
    # reader = csv.reader(f) # 기본 구분자를 ","로 인식해서 불러옴
    # reader = csv.reader(f, delimiter = '|') # 기본 구분자를 "|"로 인식해서 불러옴
    reader = csv.reader(f, delimiter = ',')
    # Header 스킵(첫번째 라인을 헤더로 본다는 의미) - 한 번 더 써주면 2줄을 헤더로 봄
    # next(reader) 

    # 확인
    print(reader)
    print(type(reader))
    print(dir(reader))

    for c in reader :
        print(c)

'''  result
['요청번호', '고유번호', '상태', '날짜']
['20200404000000000001', '11462006005046', '9', '2020-04-04 09:48:23']
['20200404000000000002', '11031996512638', '9', '2020-04-04 09:56:36']
['20200404000000000004', '11032002006183', '9', '2020-04-04 11:00:04']
['20200404000000000005', '11012011007537', '9', '2020-04-04 11:10:54']
['20200404000000000006', '11502008000933', '9', '2020-04-04 11:16:39']
'''

# 예제2) 사전 형식 출력
with open('./resource/excel_sample2.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)

    for c in reader:
        print(c)

    ''' result
    OrderedDict([('요청번호', '20200404000000000001'), ('고유번호', '11462006005046')])
    OrderedDict([('요청번호', '20200404000000000002'), ('고유번호', '11031996512638')])
    OrderedDict([('요청번호', '20200404000000000003'), ('고유번호', '11031996537746')])
    OrderedDict([('요청번호', '20200404000000000004'), ('고유번호', '11032002006183')])
    OrderedDict([('요청번호', '20200404000000000005'), ('고유번호', '11012011007537')])
    OrderedDict([('요청번호', '20200404000000000006'), ('고유번호', '11502008000933')])
    '''

    print('--------------------------------------')

# 예제3) Key Value 방식 출력
with open('./resource/excel_sample1.csv', 'r', encoding='UTF-8') as f:
    reader = csv.DictReader(f)

    for c in reader:
        for k, v in c.items():
            print(k, v)
    ''' result
    요청번호 20200404000000000001
    고유번호 11462006005046
    상태 9
    날짜 2020-04-04 09:48:23
    요청번호 20200404000000000002
    고유번호 11031996512638
    상태 9
    날짜 2020-04-04 09:56:36
    요청번호 20200404000000000003
    고유번호 11031996537746
    상태 9
    날짜 2020-04-04 10:02:12
    요청번호 20200404000000000004
    고유번호 11032002006183
    상태 9
    날짜 2020-04-04 11:00:04
    요청번호 20200404000000000005
    고유번호 11012011007537
    상태 9
    날짜 2020-04-04 11:10:54
    요청번호 20200404000000000006
    고유번호 11502008000933
    상태 9
    날짜 2020-04-04 11:16:39   
    '''            

# 예제4)  CSV 파일로 데이터 쓰기

w = [[1,2,3], [4,5,6], [7,8,9], [10,11,12], [13,14,15], [16,17,18]]

with open('./resource/excel_sample3.csv', 'w', encoding='UTF-8', newline='') as f: 
    # newline=''을 해주지 않으면 개행문자가 두개씩 들어간다.
    # wt.riterow할 때 한번 LF
    # 기본 쓰기 동작할 때 한번 LF  > 이동작은 newline=''를 해 줌으로써 방지할 수 있다.
    wt = csv.writer(f)

    for v in w:
        wt.writerow(v)

print('wrote w to ./resource/excel_sample3.csv')
''' result in excel_sample3.csv
    1,2,3
    4,5,6
    7,8,9
    10,11,12
    13,14,15
    16,17,18
'''

# 예5)  for문 없이 한 번에 쓰는 동작(writerows 사용)
with open('./resource/excel_sample4.csv', 'w', encoding='UTF-8', newline='') as f: 
    wt = csv.writer(f)
    wt.writerows(w)


print("---------------------------")
########   EXCEL (XLS, XLSX)     ###################
# 엘셀을 다루기 위한 라이브러리
# openpyxl, xlsxwrite, xlrd, xlwt, xlutils
# pandas : 주로 사용(openxyl + xlrd)

# 설치 (중요, pandas 설치)
# windows 한경에서는 scripts에서 activate된 상태의 command 창에서 다음과 같이 실행
# pip install xlrd
# pip install openpyxl
# pip install pandas

# 윈도우 환경에서 pandas Module을 인식하지 못하는 현상이 발생 할 수 있다.
# pip list 하면 pandas라는 모듈이 설치되어있다고 리스트업 되는데 실제로 다음과 같은 오류가 발생할 수 있다.
# ModuleNotFoundError: No module named 'pandas'
# 이때는 activate된 scripts 디렉토리 말고 도스창(command)을 하나 더 열어서 pip를 이용해 
# 공통 모듈로 설치하면 인식된다.

# option
# sheetname='시트명' 또는 숫자, header=숫자, skiprow=숫자

import pandas as pd

xlsx = pd.read_excel('./resource/sample.xlsx')

# 상위 데이터 확인
print(xlsx.head())
print()
'''  head()함수는 상위 5개의 row를 보여준다
SN     ISN  STATUS    SID                       기관명                                     기사제목    언론사
0  115316  413856       1   7229  문화재청-국립문화재연구소 국립중원문화재연구소           [문화재의 뒤안길]원주 노회신 벽화묘…조선에도 벽화가?   서울경제
1  117634  416174       1  19862                  한국산업기술협회     [회원사 소식] 현대제철, 업계 최초로 형강·철근 GR 인증 획득  헤럴드경제
2  117635  416175       1  19862                  한국산업기술협회    [회원사 소식] 부산환경공단, 도로 위 미세먼지 60% 이상 제거해   부산일보
3  117636  416176       1  19862                  한국산업기술협회  [회원사 소식] 화재보험협회, ESS 자동소화시스템 연구 주관기관 선정  헤럴드경제
4  117637  416177       1  19862                  한국산업기술협회   [회원사 소식] 아이씨케이, 신사업 ‘셀피’ 글로벌 카드사 인증 획득   이투데이
'''

# 데이터 확인
print(xlsx.tail())
'''  tail()함수는 하위 5개의 row를 보여준다
    SN     ISN  STATUS    SID           기관명                                  기사제목    언론사
14  118872  417412       1   9022      부산벤처기업협회     [아시아경제] `부산벤처인`들은 부지런함도 계획도 다 있었다  아시아경제
15  118874  417414       1   9022      부산벤처기업협회  [부산일보] 경제력 갖춘 뉴 시니어 등장, 100세 시대의 기회로   부산일보
16  118879  417419       1   9022      부산벤처기업협회           [전자신문] 오승이에스, 반려동물 스마트액자 개발   전자신문
17  119805  418345       1  12921  [병원]강남동강 병원              [경상일보] 무더운 한여름날 ‘뇌졸중 주의보’   경상일보
18  119821  418361       1   2220        동양물산기업    [아시아경제]농어촌公, 10개 中企와 동반성장 협약 체결...  아시아경제
'''

# 데이터확인(행과 열수 확인)
print(xlsx.shape)   # (19, 7) 총 행의 수(19)와 열의 수(7)을 확인할 수 있다.


# 엑셀 데이터 쓰기
# csv로 쓰기

xlsx.to_excel('./resource/result.xlsx', index=False)
# CP949로 쓸때 Excel에서 열면 한글이 정상
xlsx.to_csv('./resource/result_cp949.csv', index=False, encoding="CP949") 
# UTF-8로 쓰면 TextEditor에서 보면 한글이 정상인데, 엑셀에서 보면 깨짐
xlsx.to_csv('./resource/result_utf8.csv', index=False, encoding="CP949")