我有一个包含2列和数千行的工作表文件。我想遍历所有行,但只获取第一列。
这会打印出每一列,例如如何打印唯一的“ A”:
from openpyxl import load_workbook
workbook = load_workbook('file.xlsx')
sheet = workbook['Table1']
for row in sheet:
for cell in row:
print(sheet[cell.coordinate].value)
让它像这样运行,但是没有比较子句,还有没有更有效的方法呢?
for row in sheet:
for cell in row:
if cell.coordinate[0] == 'A':
print(sheet[cell.coordinate].value)
答案 0 :(得分:1)
您可以遍历所有行,然后直接访问此行和第一列中的单元格:
for rowNumber in range(1, sheet.max_row + 1):
print(sheet.cell(row=rowNumber, column=1).value)
答案 1 :(得分:0)
使用数据框可能会更简单并且应该运行得更快:
import pandas as pd
df = pd.read_excel('file.xlsx', sheet_name="Table1")
print(df.iloc[:,[0]])
使用openpyxl vs pandas加载某种程度较大的excel文件的性能测试(以提供我上面声明的PoC并提供一些实际的测试结果以回应以下查理·克拉克的评论)。仅仅是出于相互学习和知识共享的目的。
准备大文件:
import openpyxl as xl
wb = xl.Workbook()
ws = wb['Sheet']
wb.save("DUMMY1.xlsx")
xfile = xl.load_workbook('DUMMY1.xlsx')
# Load 100000 rows and 10 columns
sheet = xfile['Sheet']
for i in range(100001):
for j in range(10):
sheet.cell(row=i+1, column=j+1).value = "Hello "+str(i+1+j+1)
xfile.save('DUMMY2.xlsx')
性能测试:
import timeit
import openpyxl as xl
import pandas as pd
def func1():
xl1 = xl.load_workbook("DUMMY2.xlsx")
return xl1
def func2():
df = pd.read_excel("DUMMY2.xlsx")
return df
print(timeit.timeit('func1()', globals=globals(), number=1))
print(timeit.timeit('func2()', globals=globals(), number=1))
结果:
40.4193192
19.396849500000002
如您所见,使用openpyxl加载excel文件所需的时间是使用熊猫加载的时间的两倍以上。如果结合使用xlrd和pandas进行加载,它的加载速度甚至比加载至pandas数据帧还要快