Python으로 Excel (xls) 파일 읽기 / 파싱


117

Python ( CSV 파일 아님)으로 Excel (XLS) 파일을 읽는 가장 좋은 방법은 무엇입니까?

이 작업을 수행하기 위해 Python에서 기본적으로 지원되는 내장 패키지가 있습니까?



18
@voyager : 그는 파일을 쓰지 않고 읽기를 원합니다
John Machin

답변:


91

파일 을 읽는 데 xlrd 를 적극 권장 .xls합니다.

보이저는 COM 자동화의 사용을 언급했습니다. 몇 년 전에 직접이 작업을 수행 했으므로이 작업을 수행하는 것이 실제 PITA라는 점에 유의하십시오. 주의 사항의 수는 엄청나고 문서는 부족하고 성가시다. 나는 많은 이상한 버그와 문제를 만났는데, 그중 일부는 알아내는 데 많은 시간이 걸렸습니다.

업데이트 : 최신 .xlsx파일의 경우 읽기 및 쓰기에 권장되는 라이브러리는 openpyxl 인 것으로 보입니다 (감사합니다, Ikar Pohorský).


5
Excel 2007+ 파일 ( .xlsx)의 경우 아마도 OpenPyXL을 사용할 것입니다 .
Ikar Pohorský

48

팬더 사용 :

import pandas as pd

xls = pd.ExcelFile("yourfilename.xls")

sheetX = xls.parse(2) #2 is the sheet number

var1 = sheetX['ColumnName']

print(var1[1]) #1 is the row number...

1
pandas는 xlrd를 사용하여 읽기를 수행합니다. 당신은 또한 종속성으로 xlrd 설치해야합니다
congusbongus

25

http://www.python-excel.org/ 중 하나를 선택할 수 있습니다
. python xlrd 라이브러리를 권장합니다.

사용하여 설치

pip install xlrd

수입품

import xlrd

통합 문서를 열려면

workbook = xlrd.open_workbook('your_file_name.xlsx')

이름으로 시트 열기

worksheet = workbook.sheet_by_name('Name of the Sheet')

색인별로 시트 열기

worksheet = workbook.sheet_by_index(0)

셀 값 읽기

worksheet.cell(0, 0).value    

"셀 값 읽기"가 작동하지 않습니다. TypeError가 발생합니다. 'Sheet'개체를 호출 할 수 없습니다. 나머지는 모두 훌륭하게 작동했습니다.
Newbielp

13

팬더가 가장 좋은 방법이라고 생각합니다. 이 하나의 대답은 이미 여기에 사용 팬더와 ExcelFile기능,하지만 나를 위해 제대로 작동하지 않았다. 에서 여기에 내가 발견 read_excel잘 작동 기능 :

import pandas as pd
dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name")
print(dfs.head(10))

PS 기능이 작동 하려면 xlrd설치 해야합니다.read_excel

2020-03-21 업데이트 : 여기 에서 볼 수 있듯이 xlrd엔진에 문제 가 있으며 더 이상 사용되지 않을 예정입니다. 은 openpyxl최고의 대체합니다. 따라서 여기 에 설명 된대로 표준 구문은 다음과 같아야합니다.

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")

AttributeError : 'dict'개체에 'head'속성이 없습니다
lopezdp

4

xlsx의 경우 이전에 https://web.archive.org/web/20180216070531//programming/4371163/reading-xlsx-files-using-python으로 게시 된 솔루션이 마음에 듭니다 . 표준 라이브러리의 모듈 만 사용합니다.

def xlsx(fname):
    import zipfile
    from xml.etree.ElementTree import iterparse
    z = zipfile.ZipFile(fname)
    strings = [el.text for e, el in iterparse(z.open('xl/sharedStrings.xml')) if el.tag.endswith('}t')]
    rows = []
    row = {}
    value = ''
    for e, el in iterparse(z.open('xl/worksheets/sheet1.xml')):
        if el.tag.endswith('}v'):  # Example: <v>84</v>                            
            value = el.text
        if el.tag.endswith('}c'):  # Example: <c r="A3" t="s"><v>84</v></c>                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']  # Example: AZ22                         
            while letter[-1].isdigit():
                letter = letter[:-1]
            row[letter] = value
            value = ''
        if el.tag.endswith('}row'):
            rows.append(row)
            row = {}
    return rows

추가 된 개선 사항은 시트 이름으로 콘텐츠를 가져오고 re를 사용하여 열을 가져오고 공유 문자열이 사용되는지 확인하는 것입니다.

def xlsx(fname,sheet):
    import zipfile
    from xml.etree.ElementTree import iterparse
    import re
    z = zipfile.ZipFile(fname)
    if 'xl/sharedStrings.xml' in z.namelist():
        # Get shared strings
        strings = [element.text for event, element
                   in iterparse(z.open('xl/sharedStrings.xml')) 
                   if element.tag.endswith('}t')]
    sheetdict = { element.attrib['name']:element.attrib['sheetId'] for event,element in iterparse(z.open('xl/workbook.xml'))
                                      if element.tag.endswith('}sheet') }
    rows = []
    row = {}
    value = ''

    if sheet in sheets:
    sheetfile = 'xl/worksheets/sheet'+sheets[sheet]+'.xml'
    #print(sheet,sheetfile)
    for event, element in iterparse(z.open(sheetfile)):
        # get value or index to shared strings
        if element.tag.endswith('}v') or element.tag.endswith('}t'):
            value = element.text
        # If value is a shared string, use value as an index
        if element.tag.endswith('}c'):
            if element.attrib.get('t') == 's':
                value = strings[int(value)]
            # split the row/col information so that the row leter(s) can be separate
            letter = re.sub('\d','',element.attrib['r'])
            row[letter] = value
            value = ''
        if element.tag.endswith('}row'):
            rows.append(row)
            row = {}

    return rows

내 대답을 되살려 주셔서 감사합니다!
Collin Anderson

2

여기에 나열된 라이브러리 (예 : JExcelApi 또는 xlwt를 기반으로하는 Pyxlreader )와 COM 자동화를 사용 하여 파일을 읽는 데 Excel 자체를 사용할 수 있지만이를 위해 Office를 소프트웨어 종속성으로 도입하고 있습니다. 항상 옵션이 아닐 수도 있습니다.


6
(1) pyxlreader는 절대 수두입니다. 당신은 그것을 시도하지 않았 음에 틀림 없다. 여기 내 의견을 참조하십시오 : stackoverflow.com/questions/1243545/… (2) xlwtWriTes 파일; xlrdReaD 파일에 사용 합니다.
John Machin

2

이전 XLS 형식이 필요한 경우. ansii 'cp1251'에 대한 코드 아래.

import xlrd

file=u'C:/Landau/task/6200.xlsx'

try:
    book = xlrd.open_workbook(file,encoding_override="cp1251")  
except:
    book = xlrd.open_workbook(file)
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
   print(sh.row(rx))


0

(비 파이썬) 프로그램 xls2csv 실행을 고려할 수도 있습니다. xls 파일을 입력하면 csv가 반환됩니다.


3
하지만 포스터는 그가 파이썬을 읽어야한다고 말합니다.을 실행 하고 파이썬에서 xls2csv파싱하는 것을 제안 csv합니까?
hcarver 2012

Python-excelerator에는 Python 변환기 주위에 실행 가능한 py_xls2csv 래퍼가 포함되어 있습니다.
fatal_error 2010-04-08


0
    with open(csv_filename) as file:
        data = file.read()

    with open(xl_file_name, 'w') as file:
        file.write(data)

내장 된 패키지를 사용하여 CSV를 위와 같이 탁월하게 만들 수 있습니다. CSV는 파이썬 사전이 작동하는 것과 동일한 방식으로 작동하는 dictreader 및 dictwriter의 내장 패키지로 처리 할 수 ​​있습니다. 그래서 지금은 Excel 용 내장 패키지를 알지 못하지만 openpyxl을 발견했습니다. 또한 매우 간단하고 간단했습니다. 아래 코드 스 니펫이 도움이되기를 바랍니다.

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.