类型错误:不支持 / 的操作数类型:'str' 和 'int'

问题描述

我使用的是 python 3.7

我的列表数据是这样的

[['file1.o','.text','0x30'],['file2.o','.initvector','0x36'],['15','31','0x72']]

我的代码

用于解析文件

 c = re.compile("^\w+.*(\w+)\s+([\.\w]+)\s+([\w\.]+).*$")

打印到 csv 文件使用

 for i in module_info:
    row = [i[0],i[1],"%d" %(i[2]/1024)]
    writer.writerow(row) 

我收到此错误

TypeError: unsupported operand type(s) for /: 'str' and 'int'

我该如何解决这个问题?

我已经更新了答案。感谢所有贡献

解决方法

错误是在 i[2]/1024 这段代码中生成的,其中 i[2] 实际上被解释为一个字符串,而 1024 被解释为一个整数。这就是错误存在的原因。

您必须将字符串转换为数字

要将十六进制字符串转换为十进制数,请使用 int(i[2],16)

要将十六进制字符串转换为十进制数,请使用 bin(int(i[2],16))

使用您喜欢的转换类型并使用它。我希望这能解决您的问题。

,

由于所有第二个索引元素都是十六进制整数,您可以使用 int() 函数并将 16(基数为 16)作为第二个参数传递。

for i in module_info:
    row = [i[0],i[1],"%d" % (int(i[2],16) / 1024)]
    writer.writerow(row) 

循环遍历列表并打印 row 时:

>>> for i in lst:
        row = [i[0],16) / 1024)]
        print(row)

    
['file1.o','.text','0']
['file2.o','.initvector','0']
['15','31','0']

每次迭代中 row 的第二个元素是 "0",因为 "%d" 占位符将 (int(i[2],16) / 1024) 作为整数插入。如果您想要完整的十进制表示形式,我建议仅作为字符串插入(使用 "%s")。

>>> for i in lst:
        row = [i[0],"%s" % (int(i[2],'0.046875']
['file2.o','0.052734375']
['15','0.111328125']
,

我改变了解析文件和读取其内容的方式。当我只需要去除“origin+”时,我尝试使用贪婪量词。

#regex input format     Origin+Size        Section          Module
#                       800a1010+000c7c    .Code.Cpu0       Adc.o    #old line

 c = re.compile("^\w+.*(\w+)\s+([\.\w]+)\s+([\w\.]+).*$")

 #new line
 c = re.compile("^\w+\+(\w+)\s+([\.\w]+)\s+([\w\.]+).*$")

所以现在写入文件更改此

for i in module_info:
    row = [i[0],(i[2])]
    writer.writerow(row)    

此外,您发布的更新并未解释此代码更改如何提供十进制十六进制数,除以 1024。要详细说明吗?

除以 1024 只是为了得到以 KiloBytes 为单位的值,同时从十六进制变为十进制。我决定放弃它并在 excel 中执行此类操作。

Reference discussion on quantifiers that i got benefit from

这是否回答了您的问题?如何将十六进制字符串转换为十六进制数

这是否回答了您的问题? How to convert a hex string to hex number

是的。我现在以新的眼光看待它。

,

i[2] 是一个字符串,除非它看起来像数字。试试:

row = [i[0],"%d" %(int(i[2])/1024)]