Как лучше всего читать файлы 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.