Який найкращий спосіб читати файли Excel (XLS) з Python (не файли CSV ).
Чи є вбудований пакет, який підтримується за замовчуванням у Python для виконання цього завдання?
Який найкращий спосіб читати файли Excel (XLS) з Python (не файли CSV ).
Чи є вбудований пакет, який підтримується за замовчуванням у Python для виконання цього завдання?
Відповіді:
Я настійно рекомендую xlrd для читання .xls
файлів.
voyager згадав про використання автоматизації COM. Зробивши це кілька років тому, попередити, що це справжнє ПДФА. Кількість застережень величезна, а документації бракує та дратує. Я зіткнувся з багатьма дивними помилками та ґетчами, на деякі з яких знадобилося багато годин, щоб розібратися.
ОНОВЛЕННЯ: Для нових .xlsx
файлів рекомендована бібліотека для читання та запису є openpyxl (спасибі, Ікар Погорський).
.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
Додані вдосконалення - це отримання вмісту за назвою аркуша, використовуючи повторно для отримання стовпця та перевірку, чи використовуються спільні рядки.
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
Записує файли; використовувати 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
Ви також можете розглянути можливість запуску програми (не-python) xls2csv. Подайте його у файл 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 на вищий рівень, як вище, за допомогою вбудованих пакетів. CSV можна обробляти за допомогою вбудованого пакета dictreader та dictwriter, який буде працювати так само, як працює словник python. що робить це дуже легко Я в даний час не знаю про будь-які вбудовані пакети для excel, але я натрапив на openpyxl. Це також було досить прямо вперед і просте. Ви можете побачити фрагмент коду нижче, сподіваючись, що це допоможе
import openpyxl
book = openpyxl.load_workbook(filename)
sheet = book.active
result =sheet['AP2']
print(result.value)