Чтение / анализ файлов Excel (xls) с помощью Python - PullRequest
100 голосов
/ 31 мая 2010

Как лучше всего читать файлы Excel (XLS) с помощью Python (не CSV файлы).

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

Ответы [ 9 ]

86 голосов
/ 31 мая 2010

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

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

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

34 голосов
/ 23 мая 2017

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

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...
20 голосов
/ 06 апреля 2017

Библиотека Python 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    
3 голосов
/ 12 июня 2018

Я думаю, что Панды - лучший путь. Уже есть один ответ здесь с Пандами, использующими функцию 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

1 голос
/ 26 ноября 2012

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

1 голос
/ 31 мая 2010

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

0 голосов
/ 28 октября 2018

Для xlsx мне нравится решение, опубликованное ранее как https://stackoverflow.com/questions/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'):                                
            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
0 голосов
/ 09 апреля 2015

Python Excelerator также выполняет эту задачу. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/

Он также доступен в Debian и Ubuntu:

 sudo apt-get install python-excelerator
0 голосов
/ 19 сентября 2013

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

...