Я хотел знать, как читать весь столбец без итерации с листа excel, используя клиент win32com для python.Excel с использованием win32com и python
ответ
Самый быстрый способ - использовать встроенную функциональность Range
через API win32com.client
. Однако я не большой поклонник этого. Я думаю, что API запутан и плохо документирован, и использование его не очень pythonic (но это только я).
Если эффективность не является проблемой для вас, вы можете использовать отличную библиотеку xlrd. Вроде так:
import xlrd
book = xlrd.open_workbooks('Book1')
sheet = book.sheet_by_name('Sheet1')
sheel.col(1)
sheet.col(2)
# and so on...
Это дает вам объекты ячейки. Чтобы получить чистые значения, используйте sheet.col_values
(и есть несколько других методов, с которыми приятно работать).
Просто помните, что xlrd stand для «excel read», поэтому, если вы хотите записать в файл excel, вам понадобится другая библиотека под названием «xlwt» (что тоже довольно хорошо, хотя и меньше, чем xlrd, на мой взгляд) ,
Вы заглянули в библиотеку openpyxl? Из документации:
from openpyxl import load_workbook
wb = load_workbook(filename='file.xlsx')
ws = wb.get_sheet_by_name(name='Sheet1')
columns = ws.columns()
Существует также поддержка итераторов и других положительных героев.
Это не будет работать, если файл '.xls'. –
Вы можете прочитать целую колонку без итерации с листа, используя коллекцию Range
. Вы должны никогда не использовать Cells
, если performacne - любая проблема. Python использует модуль win32com для взаимодействия с библиотекой COM Excel. Всякий раз, когда вы используете Python и COM (Excel, PowerPoint, Acess, ADODB и т. Д.), Одним из самых больших ограничений производительности будет IO между COM и Python. С помощью метода Range
вы делаете только один вызов метода COM, а с Cells
вы делаете по одному для каждой строки. Это также было бы быстрее, если бы вы делали то же самое в VBA или .NET.
В следующем тесте я создал рабочий лист с 10 случайными символами в ячейках от A1 до A2000. Затем я извлек эти значения в списки, используя как Range, так и Cells.
import win32com.client
app = win32com.client.Dispatch("Excel.Application")
s = app.ActiveWorkbook.Sheets(1)
def GetValuesByCells():
startTime = time.time()
vals = [s.Cells(r,1).Value for r in range(1,2001)]
return time.time() - startTime
def GetValuesByRange():
startTime = time.time()
vals = [v[0] for v in s.Range('A1:A2000').Value]
return time.time() - startTime
>>> GetValuesByRange()
0.03600001335144043
>>> GetValuesByCells()
5.27400016784668
В этом случае диапазон на 2 порядка быстрее (146x) быстрее, чем ячейки. Обратите внимание, что метод Range возвращает 2D-список, где каждый внутренний список является строкой. Итерация списка переносит vals
в 2D-список, где внутренний список является столбцом.
ОК, я поддерживаю это, хотя в его нынешнем виде я действительно не считаю его ответом. Для меня это очень длинный комментарий. Почему я думаю, что он по-прежнему заслуживает повышения, так это то, что он в конечном счете более полезен и полезен, чем любой из представленных ранее ответов (несмотря на то, что yuvi уже принят). Показанный здесь фрагмент кода явно ближе всего иллюстрирует, как «читать весь столбец без итерации ... с помощью' win32com' ». –
Я просто оглянулся на этот ответ и изменил его, чтобы ответить на исходный вопрос. –
Интересно, насколько хорошо он работает против 'xlrd'. Если различия незначительны, то xlrd станет явным победителем – yuvi
Да, я попытался написать этот фрагмент кода и думал, что питон можно использовать для записи как можно меньше, поэтому мне просто интересно, есть ли что-нибудь, что просто вернет мне список с необходимыми значениями столбцов без меня для записи итерационной части. –
Вы можете использовать библиотеку xlrd, подождать секунду. Я добавлю пример – yuvi
. надеюсь, это поможет! – yuvi