AI & 파이썬

파이썬(python) / pandas / read_excel로 손상된 엑셀 파일 읽는 방법(XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b...) - 아과노트

아과노트 2023. 2. 21. 17:48
728x90
반응형

부제: 파이썬에서 엑셀 xls 파일을 엑셀 xlsx로 변환하기

파이썬 로고
파이썬

 

먼저 파이썬으로 엑셀파일을 읽는 가장 대표적인 방법은 아래와 같습니다.

 

1. 파이썬으로 excel(xlsx) 파일 읽기

아래 코드처럼 읽으면 바로 읽혀집니다.

import pandas as pd
df = pd.read_excel("example.xlsx")
print(df)

문제는 이전 엑셀 파일(xls)의 경우 입니다.

2. 파이썬으로 excel(xlsx) 파일 읽기

아래 코드처럼 엑셀(xls)파일을 읽어봅시다.

 

import pandas as pd
df = pd.read_excel("example.xls")
print(df)

 

3. 손상된 엑셀파일 파이썬으로 읽기

파이썬을 이용하여 크롤링하여 다운받은 xls 파일을 읽을려고(read_excel) 하는데 이런 오류가 발생합니다.

 

ValueError: Excel file format cannot be determined, you must specify an engine manually.
Excel 파일 형식을 결정할 수 없습니다. 수동으로 엔진을 지정해야 합니다.

엔진을 지정하라고 하니... 지정해보겠습니다.

 

import pandas as pd
df = pd.read_excel("example.xls", engine="openpyxl")
print(df)

이제 시키는대로 했으니 잘 될까? 하고 돌리면...

 

 

BadZipFile: File is not a zip file
파일이 zip 파일이 아닙니다.

 

BadZipFile: File is not a zip file 오류가 발생하면서 또 오류가 발생합니다.

 

왜 그런가 알고보니 openpyxl은 xlsx는 읽지만 xls는 읽지 못한다고 합니다

 

 

openpyxl은 xlsx를 열 때만 사용하셔야 합니다
-아과노트-

 

그럼 xls는 어떤 엔진을 사용할까 찾아보니 xlrd를 사용한다고 합니다.

다시 수정해 봅시다.

 

import pandas as pd
df = pd.read_excel("example.xls", engine="xlrd")
print(df)

이번에 나는 에러는 뭘까? 확인해 봤더니..

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\n\n\n\n\n\n\n\n' 라는 오류가 발생하네요..

XLRDError: Unsupported format, or corrupt file: Expected BOF record; found b'\n\n\n\n\n\n\n\n'
지원되지 않는 형식 또는 손상된 파일: 예상 BOF 레코드; 발견 b'\n\n\n\n\n\n\n\n'

 

뭐가 문제지? 하고 엑셀파일을 직접 열어보니... 엑셀파일을 열 때도 아래와 같은 메세지가 뜹니다.

엑셀파일 손상알림
아오... 파일 좀 잘 좀 주지..ㅠ_ㅠ

 

그리고 "예" 를 누르면 엑셀에서는 꾸역꾸역 파일을 열어 냅니다.

하지만 파이썬에서는 읽어내지 못하고 있습니다.

 

그래서 해결방법은 꾸역꾸역 열린 엑셀파일에서 다른이름으로 저장을 해서 Excel 통합 문서 (*.xlsx) 파일로 만들면 열립니다.

엑셀파일 다른이름으로 저장

 

코드는 아래와 같습니다.

import pandas as pd
df = pd.read_excel("example.xlsx", engine='openpyxl')
print(df)

그럼 xls 에서 xlsx로 바꾸는 부분도 파이썬으로 자동화 해야겠지요...

 

4. 파이썬에서 엑셀 xls 파일을 엑셀 xlsx로 변환하기

 

바꾸는 함수는 아래처럼 짜면 됩니다.

 

import win32com.client as win32
import os

def convert_xlxs(file_name):
    path = os.getcwd()
    fname = f'{path}\\{file_name}'
    excel = win32.gencache.EnsureDispatch('Excel.Application')
    wb = excel.Workbooks.Open(fname)
    # FileFormat = 51 is for .xlsx extension, 56 is for .xls extension
    wb.SaveAs(fname + "x", FileFormat=51)  
    wb.Close()  
    excel.Application.Quit()

 

그러면 문제 없이 파이썬에서 읽어오시는 것을 확인할 수 있습니다.

 

오늘도 고생많으셨습니다.

 

 

728x90
반응형