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

117

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

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

qrbaQ
источник
18
@voyager: он хочет ЧИТАТЬ файлы, а не записывать их
Джон Мачин,

Ответы:

92

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

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

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

Taleinat
источник
5
Для файлов Excel 2007+ ( .xlsx) вы, вероятно, будете использовать OpenPyXL .
Икар Погорски
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...
borgomeister
источник
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    
Somil
источник
«Прочитанное значение ячейки» не работает ... вызывает ошибку TypeError: объект «Лист» не может быть вызван. Все остальное отлично поработало.
Newbielp
14

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

Обновление 21-03-2020: Как вы можете видеть здесь , есть проблемы с xlrdдвижком, и он будет устаревшим. openpyxlЯвляется лучшей заменой. Итак, как описано здесь , канонический синтаксис должен быть:

dfs = pd.read_excel("your_file_name.xlsx", sheet_name="your_sheet_name", engine="openpyxl")
Foad
источник
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
Ханс де Риддер
источник
Спасибо, что оживили мой ответ!
Коллин Андерсон
2

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

Эстебан Кюбер
источник
6
(1) pyxlreader - это абсолютная оспа. Вы, должно быть, никогда не пробовали. Смотрите мои комментарии здесь: stackoverflow.com/questions/1243545/… (2) xlwtфайлы WriTes; использовать xlrdдля файлов ReaD.
Джон Мачин,
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 (не на языке Python). Подайте ему файл xls, и вы должны получить обратно CSV.

Moi
источник
3
Но плакат говорит, что ему нужно прочитать в Python ... Вы предлагаете запустить xls2csv, а затем разобрать csvиз Python?
hcarver
Python-excelerator содержит исполняемую оболочку py_xls2csv вокруг конвертера python.
fatal_error
0

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

Гэвин Смит
источник
0
    with open(csv_filename) as file:
        data = file.read()

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

Вы можете превратить CSV в Excel, как указано выше, с помощью встроенных пакетов. CSV можно обрабатывать с помощью встроенного пакета dictreader и dictwriter, который будет работать так же, как работает словарь Python. что упрощает задачу. В настоящее время я не знаю ни о каких встроенных пакетах для Excel, но я наткнулся на openpyxl. Это также было довольно просто и понятно. Вы можете увидеть фрагмент кода ниже, надеюсь, это поможет.

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
Акаш г кришнан
источник
0

Для старых .xlsфайлов вы можете использоватьxlrd

либо вы можете использовать его xlrdнапрямую, импортировав его. Как показано ниже

import xlrd
wb = xlrd.open_workbook(file_name)

Или вы также можете использовать pd.read_excel()метод pandas , но не забудьте указать движок, хотя по умолчанию xlrdон должен быть указан.

pd.read_excel(file_name, engine = xlrd)

Оба они работают с более старыми .xlsформатами файлов. Фактически, я столкнулся с этим, когда использовал OpenPyXL, я получил ошибку ниже

InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.
Дипак Хариш
источник