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