Каков наилучший способ чтения файлов Excel (XLS) с файлами Python (не CSV).
Есть ли встроенный пакет, который поддерживается по умолчанию в Python для выполнения этой задачи?
Каков наилучший способ чтения файлов Excel (XLS) с файлами Python (не CSV).
Есть ли встроенный пакет, который поддерживается по умолчанию в Python для выполнения этой задачи?
Я настоятельно рекомендую xlrd для чтения файлов .xls
.
Вояджер упомянул об использовании автоматизации COM. Сделав это сам несколько лет назад, предупреждаю, что это настоящая PITA. Количество предостережений огромно, а документация отсутствует и раздражает. Я столкнулся с множеством странных ошибок и ошибок, некоторые из которых заняли много часов, чтобы выяснить.
ОБНОВЛЕНИЕ: Для более новых файлов .xlsx
рекомендуемая библиотека для чтения и записи выглядит как openpyxl (спасибо, Икар Похорски).
Использование 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...
Вы можете выбрать любой из них 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
Я думаю, что Панды - лучший путь. Уже есть один ответ здесь с пандами, использующими функцию 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
Вы можете использовать любую из перечисленных ниже библиотек (например, Pyxlreader, основанный на JExcelApi, или xlwt), плюс COM для использования самого Excel для чтения файлов, но для этого вы представляете Office как зависимость от вашего программного обеспечения, что может быть не всегда возможным.
Вы также можете рассмотреть возможность запуска (не-python) программы xls2csv. Подайте файл xls, и вы должны вернуть csv.
Для 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
Для старых файлов Excel существует модуль OleFileIO_PL, который может читать используемый формат структурированного хранения OLE.
Python Excelerator также выполняет эту задачу. http://ghantoos.org/2007/10/25/python-pyexcelerator-small-howto/
Он также доступен в Debian и Ubuntu:
sudo apt-get install python-excelerator