Python 有人能解释一下为什么在使用OpenPYXL2.6.2时会发生这种情况吗?

Python 有人能解释一下为什么在使用OpenPYXL2.6.2时会发生这种情况吗?,python,openpyxl,Python,Openpyxl,根据我的理解,workbook.get\u sheet\u names()已被弃用,我们应该使用wb.sheetnames代替openpyxl2.6.2 wb.sheetnames返回所有工作表的列表,为什么我们不能这样做 import openpyxl wb=openpyxl.load_workbook('example.xlsx') #loading the workbook wb.sheetnames #getting the sheetnames with the

根据我的理解,
workbook.get\u sheet\u names()
已被弃用,我们应该使用
wb.sheetnames
代替
openpyxl
2.6.2

wb.sheetnames
返回所有工作表的
列表,为什么我们不能这样做

    import openpyxl
    wb=openpyxl.load_workbook('example.xlsx') #loading the workbook
    wb.sheetnames #getting the sheetnames with the new recomended code
    #output:['Sheet']
    wb.sheetnames[0]='Another name'
    wb.sheetnames[0] # Checking if it were changed or not
    #output:['Sheet']
如果
wb.sheetnames
充当
列表
,为什么上面的代码不起作用? 没有显示错误,但我没有看到预期的更改

这就是
example.xls
的外观:


这是因为
sheetnames
是一个属性;换句话说,它看起来像一个实例属性,但当您访问它时,实际上调用了一个函数。您可以查看更多详细信息

现在,如果我们查看
openpyxl
源代码,我们可以找到
sheetnames
的定义:

    @property
    def sheetnames(self):
        return [s.title for s in self._sheets]
sheetnames
每次调用时都会创建并返回一个新的
列表
,您可以用
id
来证明:

from openpyxl import Workbook

book = Workbook()

a = book.sheetnames
b = book.sheetnames

print(id(a) == id(b))
输出:

False
因此,您实际上只是在修改这个新的
列表的第一个元素,该列表是在每次调用
sheetnames
链接到相关页面时创建的

wb.sheetnames
将返回字符串列表(即仅工作表名称),
wb.sheetnames[0]
只是一个字符串。 当您
wb.sheetnames[0]=“另一个名称”
时,您会更改wb.sheetnames返回的列表中的第一个字符串,但此更改没有任何实际/可见的效果,因为此列表未分配给任何变量

还有
wb.worksheets
,它将返回工作表对象列表。您可以使用此方法访问相应的工作表,并使用sheet.title属性do
wb.工作表[0]。title='New title'

from openpyxl import Workbook
wb = Workbook()
print(wb.sheetnames)
print(type(wb.sheetnames[0]))
print(wb.worksheets) 
print(type(wb.worksheets[0]))
wb.worksheets[0].title='New Title'
print(wb.sheetnames)
print(wb.worksheets)
输出

['Sheet']
<class 'str'>
[<Worksheet "Sheet">]
<class 'openpyxl.worksheet.worksheet.Worksheet'>
['New Title']
[<Worksheet "New Title">]
['Sheet']
[]
[“新标题”]
[]

注意-例如,我正在使用新工作簿实例,其中只有一张工作表

我是一名新程序员,可以通过更改标题属性来解决这一问题,但我不想在学习过程中留下任何空白。您可以共享示例。xlsx吗?您可以使用或Google drive,也可以复制粘贴问题中的数据。是否可以复制@JadAH?如果我使用Pandas为您提供替代解决方案,是否可以?唯一的方法是直接更改标题属性
['Sheet']
<class 'str'>
[<Worksheet "Sheet">]
<class 'openpyxl.worksheet.worksheet.Worksheet'>
['New Title']
[<Worksheet "New Title">]