2013-09-02 1 views

ответ

1

Самый быстрый способ - использовать встроенную функциональность 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, на мой взгляд) ,

+0

Да, я попытался написать этот фрагмент кода и думал, что питон можно использовать для записи как можно меньше, поэтому мне просто интересно, есть ли что-нибудь, что просто вернет мне список с необходимыми значениями столбцов без меня для записи итерационной части. –

+0

Вы можете использовать библиотеку xlrd, подождать секунду. Я добавлю пример – yuvi

+0

. надеюсь, это поможет! – yuvi

2

Вы заглянули в библиотеку openpyxl? Из документации:

from openpyxl import load_workbook 
wb = load_workbook(filename='file.xlsx') 
ws = wb.get_sheet_by_name(name='Sheet1') 
columns = ws.columns() 

Существует также поддержка итераторов и других положительных героев.

+1

Это не будет работать, если файл '.xls'. –

8

Вы можете прочитать целую колонку без итерации с листа, используя коллекцию 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-список, где внутренний список является столбцом.

+1

ОК, я поддерживаю это, хотя в его нынешнем виде я действительно не считаю его ответом. Для меня это очень длинный комментарий. Почему я думаю, что он по-прежнему заслуживает повышения, так это то, что он в конечном счете более полезен и полезен, чем любой из представленных ранее ответов (несмотря на то, что yuvi уже принят). Показанный здесь фрагмент кода явно ближе всего иллюстрирует, как «читать весь столбец без итерации ... с помощью' win32com' ». –

+0

Я просто оглянулся на этот ответ и изменил его, чтобы ответить на исходный вопрос. –

+0

Интересно, насколько хорошо он работает против 'xlrd'. Если различия незначительны, то xlrd станет явным победителем – yuvi

 Смежные вопросы

  • Нет связанных вопросов^_^