Чтение/разбор файлов Excel (xls) с помощью Python

Каков наилучший способ чтения файлов Excel (XLS) с файлами Python (не CSV).

Есть ли встроенный пакет, который поддерживается по умолчанию в Python для выполнения этой задачи?

Ответ 1

Я настоятельно рекомендую xlrd для чтения файлов .xls.

Вояджер упомянул об использовании автоматизации COM. Сделав это сам несколько лет назад, предупреждаю, что это настоящая PITA. Количество предостережений огромно, а документация отсутствует и раздражает. Я столкнулся с множеством странных ошибок и ошибок, некоторые из которых заняли много часов, чтобы выяснить.

ОБНОВЛЕНИЕ: Для более новых файлов .xlsx рекомендуемая библиотека для чтения и записи выглядит как openpyxl (спасибо, Икар Похорски).

Ответ 2

Использование pandas:

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...

Ответ 3

Вы можете выбрать любой из них 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    

Ответ 4

Я думаю, что Панды - лучший путь. Уже есть один ответ здесь с пандами, использующими функцию ExcelFile, но он не сработал для меня должным образом. С здесь я обнаружил функцию read_excel, которая прекрасно работает:

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

P.S. Для работы функции read_excel необходимо установить xlrd

Ответ 5

Вы можете использовать любую из перечисленных ниже библиотек (например, Pyxlreader, основанный на JExcelApi, или xlwt), плюс COM для использования самого Excel для чтения файлов, но для этого вы представляете Office как зависимость от вашего программного обеспечения, что может быть не всегда возможным.

Ответ 6

Вы также можете рассмотреть возможность запуска (не-python) программы xls2csv. Подайте файл xls, и вы должны вернуть csv.

Ответ 7

Для xlsx мне нравится решение, опубликованное ранее как fooobar.com/questions/59659/.... Я использую только модули из стандартной библиотеки.

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'):                                
            value = el.text
        if el.tag.endswith('}c'):                                 
            if el.attrib.get('t') == 's':
                value = strings[int(value)]
            letter = el.attrib['r']                             
            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

Ответ 8

Для старых файлов Excel существует модуль OleFileIO_PL, который может читать используемый формат структурированного хранения OLE.