python - openpyxl 无法追加列表数据类型,一直显示 TypeError: Value must be a list
问题描述
这是我的代码
from openpyxl import Workbook
from openpyxl import load_workbook
def get_data_list(filename, sheetname):
data = record = []
# load excel file, read only mode
wb = load_workbook(filename, read_only=True)
# select sheet
sheet = wb[sheetname]
# write into data
for row in sheet.rows:
for cell in row:
record.append(cell.value)
data.append(record)
record = []
return data
def write_data_list(data, filename, sheetname, no_header=False):
wb = Workbook()
sheet = wb.active
sheet.title = sheetname
# check header data
if no_header :
data.pop(0)
# insert data
for row in data:
sheet.append(row)
# save into file
wb.save(filename)
data = get_data_list('excel/sample.xlsx','Sheet1')
# print(type(data))
write_data_list(data, 'data.xlsx', 'data')
我运行此代码并产生此错误消息:
Traceback (most recent call last):
File "C:\Users\xxx\Projects\mergexl\rw.py", line 37, in <module>
write_data_list(data, 'data.xlsx', 'data')
File "C:\Users\xxx\Projects\mergexl\rw.py", line 31, in write_data_list
sheet.append(row)
File "C:\Users\xxx\.virtualenvs\mergexl-aotJkH4X\lib\site-packages\openpyxl\worksheet\worksheet.py", line 788, in append
self._invalid_row(iterable)
File "C:\Users\xxx\.virtualenvs\mergexl-aotJkH4X\lib\site-packages\openpyxl\worksheet\worksheet.py", line 872, in _invalid_row
type(iterable))
TypeError: Value must be a list, tuple, range or generator, or a dict. Supplied value is <class 'str'>
如您所见,此错误在第 33 行显示了一个问题,“sheet.append(row)”一直询问列表数据类型输入。但是,可变数据已经是一个列表。我检查了数据类型
print(type(data))
然后输出是类'list' ,但错误消息一直告诉数据是类'str'
有什么解决办法吗?
解决方案
data = record = []
没有做你认为的事情。
它绑定data
和record
命名同一个列表对象。
以下循环第一次运行,data
并且record
是相同的列表,并且cell.value
第一行中的所有内容在添加之前都添加到该列表record
中。
cell.value
不是列表类的实例。
for row in sheet.rows:
for cell in row:
record.append(cell.value)
data.append(record)
record = []
return data
您需要初始化数据并记录为单独的列表。
data = []
for row in sheet.rows:
record = []
for cell in row:
record.append(cell.value)
data.append(record)
return data
推荐阅读
- .net - MSIL 代码和机器代码比较 (.NET)
- r - 获取错误没有适用于“as.raster”的方法应用于“shiny.tag”类的对象
- react-native-web - React Native Web 中可访问且可设置样式的按钮?
- python - 下拉菜单无法使用 Kivy 语言
- python - 填写缺失的日期值并根据前一行填充第二列
- bazel - 如何通过“ctx.actions.run(...)”调试由 Bazel 规则执行的“java_binary”目标?
- python - 图像处理 剪切与图案不同的区域
- c# - 有人能告诉我为什么 (return DayName;) 会导致错误,因为它是一个未分配的局部变量吗?
- apache-kafka - Kafka 消费者向代理发送更多获取请求
- sql - 在 Where-In SQL-Oracle 中传递多个参数