파이썬 xlsx to csv: 엑셀 파일 변환 방법 3가지

엑셀 파일 xlsx를 csv로 변환해야 하는 경우가 있습니다. 파이썬 xlsx to csv 변환 방법에 대해 살펴보겠습니다.

파이썬 xlsx to csv: 엑셀 파일 변환

Python에서 엑셀 파일을 다룰 수 있는 패키지에는 여러 가지가 있습니다. pandas, openpyxl, xlrd를 이용해서 xlsx 파일을 csv 파일로 변환해 보도록 하겠습니다.

아래 그림과 같은 엑셀 파일을 변환해 보도록 하겠습니다.

그림 1. 파이썬 xlsx to csv: 엑셀 파일 원본
그림 1. 파이썬 xlsx to csv: 엑셀 파일 원본

pandas를 이용한 xls, xlsx to csv

pandas를 이용해서 read_excel 메서드로 엑셀 파일을 읽어들이고, to_csv 메서드로 csv파일을 저장합니다.

import pandas as pd

xlsx = pd.read_excel("input.xlsx")
xlsx.to_csv("output.csv")
Python

위의 코드를 실행하면 아래와 같은 결과로 저장됩니다. 그런데 뭔가 이상한 느낌이 들죠? 제일 앞에 인덱스가 값으로 추가된 것을 볼 수 있습니다. 인덱스가 필요한 경우도 있겠지만, 그렇지 않다면 인덱스를 제외해야겠죠.

그림 2. xlsx to csv 저장 결과: 인덱스 포함
그림 2. xlsx to csv 저장 결과: 인덱스 포함

인덱스 제외는 index 파라미터를 다음과 같이 활용하면 됩니다.

xlsx.to_csv("output.csv", index=False)
Python

이제 엑셀의 시트 내의 값만 저장된 것을 확인할 수 있습니다.

그림 3. xlsx to csv 저장 결과: 인덱스 미포함
그림 3. xlsx to csv 저장 결과: 인덱스 미포함

openpyxl을 이용한 xlsx to csv

openpyxl의 경우에는 openpyxl 자체에 csv로 저장할 수 있는 기능이 없기 때문에 csv 패키지를 이용해서 csv파일로 저장해야 합니다. pandas보다는 조금 복잡한 방법이라고 할 수 있습니다.

그리고 pandas와는 다르게 xls 확장자를 지원하지 않습니다. 따라서 xls를 이용하고자 한다면, pandas나 그 외의 패키지를 활용하시기 바랍니다.

sheet.iter_rows에서 values_only를 True로 지정하지 않으면 Cell 객체가 텍스트화되어 그냥 들어가므로, 꼭 values_only에는 True값을 넣어서 iter_rows() 메서드를 이용하시기 바랍니다.

from openpyxl import load_workbook
import csv

# 엑셀 파일 읽기
wb = load_workbook('input.xlsx')
sheet = wb.active

# CSV로 저장하기
with open('output.csv', 'w') as f:
    writer = csv.writer(f)
    for row in sheet.iter_rows(values_only=True):
        writer.writerow(row)
    f.close()
Python

파이썬 xls to csv: 엑셀 파일 변환

xlsx 파일 변환을 위해서는 pandas나 openpyxl을 이용했습니다. pandas는 xlsx와 xls 파일 포맷을 모두 지원 앞서 설명했듯이 openpyxl은 xlsx만을 지원하고 xls파일 포맷은 지원하지 않습니다. 하지만 pyexcel과 xlrd는 원본 파일을 읽을 때 xlsx를 지원하지 않고, xls 파일만을 지원합니다.

pyexcel을 이용한 xls to csv

pyexcel을 이용한 방법으로는 pyexcel의 save_book_as 메서드를 이용해서 input 파일의 파라미터인 file_name과 변환할 결과 파일이름인 dest_file_name을 지정해 주면 간단히 xls 파일을 csv로 변환할 수 있습니다.

import pyexcel

pyexcel.save_book_as(file_name='input.xls', dest_file_name='output.csv')
Python

만약 xls 파일을 읽은 후, 어떤 작업 후 csv로 저장하고자 한다면 아래와 같은 코드를 이용하셔도 됩니다.

import pyexcel

# 엑셀 파일 읽기
sheet = pyexcel.get_sheet(file_name='input.xls')

# CSV로 저장하기
sheet.save_as('output.csv')
Python

xlrd를 이용한 xls to csv

lxrd를 이용한 방법은 아래와 같이 실행하면 됩니다. 첫째 시트를 읽어온 후, csv의 writer 객체로 시트에서 한 행씩 읽어온 값들을 기록하는 형태입니다.

import xlrd
import csv

# 엑셀 파일 읽기
book = xlrd.open_workbook('../cut_paste_rows.xls')
sheet = book.sheet_by_index(0)

# CSV로 저장하기
with open('output_file.csv', 'w') as f:
    writer = csv.writer(f)
    for row_idx in range(sheet.nrows):
        writer.writerow(sheet.row_values(row_idx))
    f.close()
Python

단, 제가 해봤을 때에 아래 그림과 같이 정수값들이 실수화되어 저장되었습니다. 따라서 xlrd를 이용할 때에는 값의 처리에도 별도로 신경을 써 주셔야 할 것 같습니다.

그림 4. xlrd를 이용한 xls to csv: 정수값이 실수값으로 변경됨
그림 4. xlrd를 이용한 xls to csv: 정수값이 실수값으로 변경됨

xls, xlsx to csv 비교 정리

가장 간편하게 엑셀을 변환할 수 있는 것은 pyexcel의 save_book_as 메서드를 활용하는 것이었습니다. 하지만 pyexcel은 xls 파일만을 지원하고 xlsx를 지원하지 않는 점이 아쉬웠습니다.

그 다음으로는 pandas를 이용한 방식이 가장 깔끔하고 좋았습니다. xlsx뿐 아니라 xls도 모두 지원해서 가장 데이터를 읽어오기에도 적절했고, 쓰는 방식도 간편했습니다.

openpyxl과 xlrd의 경우에는 엑셀 파일을 읽어와서 각 값들을 일일히 csv로 작성해줘야 하는 불편함이 다소 있었습니다.

저라면 xlsx와 xls를 모두 지원하고 csv를 저장하는 기능도 모두 가지고 있는 pandas를 이용하는 방법을 권장합니다. pandas는 확실히 데이터를 처리하는데 사용하는 유용한 패키지이다보니 기능적으로는 가장 강력한 것 같습니다. 하지만 엑셀 파일 자체를 다뤄야 한다면 openpyxl, pyexcel, xlrd 등을 활용하셔야겠죠.

필요하셨던 분들께 도움이 되셨길 바랍니다.

관련 자료

pandas의 to_csv, read_excel, openpyxl의 worksheet, xlrd의 api 문서, pyexcel의 save_book_as를 참고하였습니다.

같이 읽으면 좋은 글

Leave a Comment