Читання / аналіз файлів Excel (xls) з Python


117

Який найкращий спосіб читати файли Excel (XLS) з Python (не файли CSV ).

Чи є вбудований пакет, який підтримується за замовчуванням у Python для виконання цього завдання?



18
@voyager: він хоче ЧИТАТИ файли, а не записувати їх
Джон Махін

Відповіді:


91

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

voyager згадав про використання автоматизації COM. Зробивши це кілька років тому, попередити, що це справжнє ПДФА. Кількість застережень величезна, а документації бракує та дратує. Я зіткнувся з багатьма дивними помилками та ґетчами, на деякі з яких знадобилося багато годин, щоб розібратися.

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


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
панди використовують 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: "Аркуш" об'єкта не можна викликати. Усі решта працювали чудово.
Newbielp

13

Я думаю, що 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")

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

Додані вдосконалення - це отримання вмісту за назвою аркуша, використовуючи повторно для отримання стовпця та перевірку, чи використовуються спільні рядки.

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Записує файли; використовувати 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

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


3
Але плакат говорить, що йому потрібно прочитати на Python ... Ви пропонуєте запустити xls2csv, а потім розібрати csvз Python?
hcarver

Python-excelerator містить виконувану оболонку py_xls2csv навколо перетворювача python.
fatal_error


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, який буде працювати так само, як працює словник python. що робить це дуже легко Я в даний час не знаю про будь-які вбудовані пакети для excel, але я натрапив на openpyxl. Це також було досить прямо вперед і просте. Ви можете побачити фрагмент коду нижче, сподіваючись, що це допоможе

    import openpyxl
    book = openpyxl.load_workbook(filename)
    sheet = book.active 
    result =sheet['AP2']
    print(result.value)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.