【问题标题】:Comparing values in Excel cells比较 Excel 单元格中的值
【发布时间】:2016-02-02 21:11:56
【问题描述】:

我有两个工作簿:

  • wkbk1 在特定列的每个单元格中都有一个 IP 地址。
  • wkbk2 没有 IP 地址、单个 IP 或多个 IP 在特定的每个单元格中由一个新行(与逗号)分隔 列。

我正在尝试将 wkbk1 中单元格的值与 wkbk2 中的值进行比较。

我遇到的问题是搜索会将 wkbk1 IP = 10.10.10.16 与 wkbk2 IP = 10.10.10.168(以及任何其他变体)进行比较。

如果我按 (wkbk1 IP + \n) 搜索,则无法比较单行单元格。

以下是我的代码:

#variable top store the highest row number
mRow = str(mapIP.get_highest_row()) 
eRow = str(assetSheet.get_highest_row())

i = 2 #variable for row number output, skips the first row (b/c it is the header row, duh)

#create data by comparing IP in map to IP in CMDB
for mapIpRow in mapIP['A1':'A' + mRow]:
        for mapIpCell in mapIpRow:
            for assetIpRow in assetSheet['E1':'E' + eRow]:
                for assetIpCell in assetIpRow:
                    assetIp = str(assetIpCell.value)
                    mapIp = str(mapIpCell.value)
                    if mapIp in assetIp:
                        outSheet['A' + str(i)].value = mapIp
                        print(mapIp) #just for feedback that the program is running
                        dnsM = mapIP['B' + str(mapIpCell.row)].value
                        owner = assetSheet['F' + str(assetIpCell.row)].value
                        dnsQ = assetSheet['B' + str(assetIpCell.row)].value #cishort
                        dnsQ2 = assetSheet['C' + str(assetIpCell.row)].value #cialias
                        dnsQ3 = assetSheet['D' + str(assetIpCell.row)].value #ciDesc
                        ciIP = assetSheet['E' + str(assetIpCell.row)].value #ciIP
                        ciID = assetSheet['A' + str(assetIpCell.row)].value #ciID
                        outSheet['B' + str(i)].value = dnsM
                        outSheet['C' + str(i)].value = owner
                        outSheet['D' + str(i)].value = dnsQ
                        outSheet['E' + str(i)].value = dnsQ2
                        outSheet['F' + str(i)].value = dnsQ3
                        outSheet['G' + str(i)].value = ciIP
                        outSheet['H' + str(i)].value = ciID
                        print owner #just for feedback that the program is running
                        i = i + 1
                    else:
                        pass

【问题讨论】:

    标签: python excel


    【解决方案1】:

    获取每个单元格值(可能包含 0、1 或多个 IP)并使用 .split('\n') 将其放入列表中。您的列表比较 if mapIp in assetIp 应该仍然有效。

    assetIp = assetIpCell.value.split('\n') if assetIpCell.value else ''
    mapIp = str(mapIpCell.value)
    if mapIp in assetIp:
    

    这应该可以解决您的问题:

    我遇到的问题是搜索会将 wkbk1 IP = 10.10.10.16 与 wkbk2 IP = 10.10.10.168(以及任何其他变体)进行比较。

    比较字符串时in操作符会返回子字符串结果,即:

    'a' in 'David' == True
    '10.10.10.16` in `10.10.10.168` == True
    

    in 运算符与列表一起使用时,仅当列表中存在完全匹配时才会返回 True

    '10.10.10.16`' in ['10.52.1.1', '99.32.9.0', '168.152.1.1', `10.10.10.168`] == False
    

    【讨论】:

    • 这很完美!我确实必须将assetIpCell.value 转换为字符串,然后拆分为列表。非常感谢!
    • 干杯。如果解决了问题,请考虑将此答案标记为“已接受”。出于好奇,type 的数据在 assetIpCell.value 的开头是什么?我希望它是字符串(但我没有测试)
    • 这是一个IP地址单元格,它们用回车而不是逗号分隔。但是有些单元格是空的,它们将被分配一个 Nonetype
    • Ahhh OK 我知道None 类型抛出异常,因此str 转换。如果您想避免 str 转换,可以使用三元语句:assetIp = assetIpCell.value.split('\n') if assetIpCell.value else ''
    猜你喜欢
    • 2019-01-10
    • 2019-07-05
    • 2013-11-29
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    相关资源
    最近更新 更多