将 Excel 列中的数据读入 Python 列表
Read data in Excel column into Python list
我正在使用 python xlwings 读取 Excel 2013 年的一列数据。第 A
列填充有数字。要将此列导入 python 列表 py_list
,我有以下代码;
import xlwings as xw
wb = xw.Book('BookName.xlsm')
sht = xw.Book('SheetName')
py_list = sht.range('A2:A40').value
如果列数据填充在 A2:A40
,则以上代码有效。但是,列数据可以保持增长。数据可以增长并延伸到 A2:A46
或 A2:A80
。最后一行是空的。编译时不知道这一列有多少行数据。
如何修改代码以检测最后一行的空单元格,以便 py_list
可以读取数据范围?
除了 xlwings,我愿意使用其他 python 库来读取 Excel 数据。我正在使用 python v3.6
关于从 csv 或 excel 中读取文件,我说了很多,但我会使用 pandas
。
import pandas as pd
df = pd.read_excel('filename.xlsm', sheetname=0) # can also index sheet by name or fetch all sheets
mylist = df['column name'].tolist()
另一种方法是在 excel 中使用诸如 OFFSET 之类的动态公式而不是 'A2:A40'
,或者可能是命名范围?
这道题的关键是找出第 A
列的行数。
可以使用下面的 xlwings 通过这一行找到行数;
rownum = sht.range('A1').end('down').last_cell.row
需要仔细阅读 API 文档才能得到答案。
http://docs.xlwings.org/en/stable/api.html#xlwings.Range
一旦找到行数,就很容易计算出其余部分。
我发现这是从 excel 中的整个列创建列表的最简单方法,它只需要填充的 excel 单元格。
将 pandas 导入为 pd
将 numpy 导入为 np
#Insert complete path to the excel file and index of the worksheet
df = pd.read_excel("PATH.xlsx", sheet_name=0)
# insert the name of the column as a string in brackets
list1 = list(df['Column Header 1'])
list2 = list(df['Column Header 2'])
print(list1)
print(list2)
我知道这是一个老问题,但你也可以使用 openpyxl
from openpyxl import load_workbook
wb = load_workbook("BookName.xlsx") # Work Book
ws = wb.get_sheet_by_name('SheetName') # Work Sheet
column = ws['A'] # Column
column_list = [column[x].value for x in range(len(column))]
备注:
Pandas 是一个很棒的库,但是安装它只是为了将 excel 列读入列表是一种矫枉过正的恕我直言。
xlrd is not maintained anymore. From the xlrd github page
PLEASE NOTE: This library currently has no active maintainers. You are advised to use OpenPyXL instead.
我通过 xlwings 文档寻找一些东西,没有找到这样的东西,但你总是可以尝试解决这个问题:
temp = [x for x in xw.Range('A2:A200').value if x != None] #A200 just put a big number..
或者我不知道试试这个:
from itertools import takewhile
temp =[takewhile(lambda x: x != None, xw.Range('A2:A70').value)]
while True:
try:
next(temp)
except StopIteration:
break
在第 2 行,起初我尝试这样做:
temp =[lambda x: x for x in xw.Range('D:D').values if x != None else exit()] #or to replace this with quit() but there is no option to break lambdas as far as I know
另一个选项:
temp = iter(xw.Range('A:A').value)
list = []
a = next(temp) #depending your first cell starts at row 1
while a != None: #might want zeros or '' etc
list.append(a)
a = next(temp)
我正在使用 python xlwings 读取 Excel 2013 年的一列数据。第 A
列填充有数字。要将此列导入 python 列表 py_list
,我有以下代码;
import xlwings as xw
wb = xw.Book('BookName.xlsm')
sht = xw.Book('SheetName')
py_list = sht.range('A2:A40').value
如果列数据填充在 A2:A40
,则以上代码有效。但是,列数据可以保持增长。数据可以增长并延伸到 A2:A46
或 A2:A80
。最后一行是空的。编译时不知道这一列有多少行数据。
如何修改代码以检测最后一行的空单元格,以便 py_list
可以读取数据范围?
除了 xlwings,我愿意使用其他 python 库来读取 Excel 数据。我正在使用 python v3.6
关于从 csv 或 excel 中读取文件,我说了很多,但我会使用 pandas
。
import pandas as pd
df = pd.read_excel('filename.xlsm', sheetname=0) # can also index sheet by name or fetch all sheets
mylist = df['column name'].tolist()
另一种方法是在 excel 中使用诸如 OFFSET 之类的动态公式而不是 'A2:A40'
,或者可能是命名范围?
这道题的关键是找出第 A
列的行数。
可以使用下面的 xlwings 通过这一行找到行数;
rownum = sht.range('A1').end('down').last_cell.row
需要仔细阅读 API 文档才能得到答案。
http://docs.xlwings.org/en/stable/api.html#xlwings.Range
一旦找到行数,就很容易计算出其余部分。
我发现这是从 excel 中的整个列创建列表的最简单方法,它只需要填充的 excel 单元格。 将 pandas 导入为 pd 将 numpy 导入为 np
#Insert complete path to the excel file and index of the worksheet
df = pd.read_excel("PATH.xlsx", sheet_name=0)
# insert the name of the column as a string in brackets
list1 = list(df['Column Header 1'])
list2 = list(df['Column Header 2'])
print(list1)
print(list2)
我知道这是一个老问题,但你也可以使用 openpyxl
from openpyxl import load_workbook
wb = load_workbook("BookName.xlsx") # Work Book
ws = wb.get_sheet_by_name('SheetName') # Work Sheet
column = ws['A'] # Column
column_list = [column[x].value for x in range(len(column))]
备注:
Pandas 是一个很棒的库,但是安装它只是为了将 excel 列读入列表是一种矫枉过正的恕我直言。
xlrd is not maintained anymore. From the xlrd github page
PLEASE NOTE: This library currently has no active maintainers. You are advised to use OpenPyXL instead.
我通过 xlwings 文档寻找一些东西,没有找到这样的东西,但你总是可以尝试解决这个问题:
temp = [x for x in xw.Range('A2:A200').value if x != None] #A200 just put a big number..
或者我不知道试试这个:
from itertools import takewhile
temp =[takewhile(lambda x: x != None, xw.Range('A2:A70').value)]
while True:
try:
next(temp)
except StopIteration:
break
在第 2 行,起初我尝试这样做:
temp =[lambda x: x for x in xw.Range('D:D').values if x != None else exit()] #or to replace this with quit() but there is no option to break lambdas as far as I know
另一个选项:
temp = iter(xw.Range('A:A').value)
list = []
a = next(temp) #depending your first cell starts at row 1
while a != None: #might want zeros or '' etc
list.append(a)
a = next(temp)