鱼C论坛

 找回密码
 立即注册
查看: 1163|回复: 4

[已解决]python 关于 遍历元组元素取 value的问题

[复制链接]
发表于 2020-6-5 00:41:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
编译器用的Sublime text3

用的openpyxl插件

我定义了两个sheet后,把两个表当中的A列取出来比较:  col1 = sheet1['A']    col2 = sheet2['A2']


我想把两个表中的元素比较就用了 for循环:   for cell1 in col1:  ......


这个时候  cell1.value 会报 tuple' object has no attribute 'value' 错 (直接输出cell1 会一个个的 显示 <Cell 'Sheet2'.A1>这类单个元素)


但我在下面 再套一个      for  cell11 in cell1   的时候   cell11.value就没问题,


并且 cell11的value值的结果 就是  我本来想 从cell1 上取的value值

这是什么原理?求解!~!!





最佳答案
2020-6-5 23:07:01
st1['A2:A1428']这种表达式获取的是表的二维数据,嵌套内的每一个元组是一行的数据,你用st1['A2:D8']就很容易看到结果了,第一个元素,也就是第一个元组将是由A2,B2,C2,D2组成的元组,而st1['A2:A1428']的第一个元素是A2一个元素组成的元组,知道原理了也很容易修改代码了:
from openpyxl import load_workbook

wb = load_workbook(filename='新建excel测试表.xlsx')


st1 = wb['Sheet1']
st2 = wb['Sheet2']

col1 = st1['A2:A1428']
col2 = st2['A2:A17359']

for cell1 in col1:
    for cell2 in col2:
       if cell1[0].value == cell2[0].value :     #<---既然遍历出来的结果还是元组,加上[0]就行了
           print(cell2[0].value)                 #<---同上

不过,能跑是可以跑了,但是看你的数据量不小,估计那个速度嘛,估计有点酸爽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 04:23:27 | 显示全部楼层
通过你的表述判断逻辑应该是没错误的,所以问题应该出在语法上,本身col1应该就是由cell对象组成的一个元组,而你后面提到的的错误现象像是元组套着元组,我猜想最大的可能就是你在
col1 = sheet1['A']
这句话后加加个了逗号变成了
col1 = sheet1['A'],
这样就成了元组套元组。
如果不是这样你最好发一下源码,这样比较容易找到错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 07:17:36 | 显示全部楼层
@Twilight6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 22:20:00 | 显示全部楼层
txxcat 发表于 2020-6-5 04:23
通过你的表述判断逻辑应该是没错误的,所以问题应该出在语法上,本身col1应该就是由cell对象组成的一个元组 ...

谢谢解答,我找到原因了 , 但是还是没搞懂原理 !!! 具体情况如下 求解答~

我自己测试的简单 代码如下:

from openpyxl import load_workbook

wb = load_workbook(filename='新建excel测试表.xlsx')


st1 = wb['Sheet1']
st2 = wb['Sheet2']

col1 = st1['A2:A1428']
col2 = st2['A2:A17359']

for cell1 in col1:
    for cell2 in col2:
       if cell1.value == cell2.value :
           print(cell2.value)
       


用st1['A'] 直接遍历  取cell1.value没有问题,    但用st1['A2:A1428'] 遍历出来的 cell1就不行,
但我两种情况都  print(cell1) 时,   控制台输出的结果都是一样的呀?? 是我看错了么??  

如果我想取excel  A列 中的某一段 来比较数值 应该怎么操作呢??





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 23:07:01 | 显示全部楼层    本楼为最佳答案   
st1['A2:A1428']这种表达式获取的是表的二维数据,嵌套内的每一个元组是一行的数据,你用st1['A2:D8']就很容易看到结果了,第一个元素,也就是第一个元组将是由A2,B2,C2,D2组成的元组,而st1['A2:A1428']的第一个元素是A2一个元素组成的元组,知道原理了也很容易修改代码了:
from openpyxl import load_workbook

wb = load_workbook(filename='新建excel测试表.xlsx')


st1 = wb['Sheet1']
st2 = wb['Sheet2']

col1 = st1['A2:A1428']
col2 = st2['A2:A17359']

for cell1 in col1:
    for cell2 in col2:
       if cell1[0].value == cell2[0].value :     #<---既然遍历出来的结果还是元组,加上[0]就行了
           print(cell2[0].value)                 #<---同上

不过,能跑是可以跑了,但是看你的数据量不小,估计那个速度嘛,估计有点酸爽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 22:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表