
[英]TypeError: unsupported operand type(s) for <<: 'str' and 'int'
[英]TypeError: unsupported operand type(s) for /: 'str' and 'int' for
我正在使用 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。 这就是错误存在的原因。
您必须将字符串转换为数字
要将十六进制字符串转换为十进制数,请使用int(i[2], 16)
要将十六进制字符串转换为十进制数,请使用bin(int(i[2], 16))
使用您喜欢的转换类型并使用它。 我希望这能解决你的问题。
由于所有第二索引元素都是十六进制整数,因此您可以使用int()
function 并将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], i[1], "%d" % (int(i[2], 16) / 1024)]
print(row)
['file1.o', '.text', '0']
['file2.o', '.initvector', '0']
['15', '31', '0']
每次迭代row
的第二个元素是"0"
,因为"%d"
占位符插入(int(i[2], 16) / 1024)
作为 integer。 如果你想要完整的十进制表示,我建议只插入一个字符串(使用"%s"
)。
>>> for i in lst:
row = [i[0], i[1], "%s" % (int(i[2], 16) / 1024)]
print(row)
['file1.o', '.text', '0.046875']
['file2.o', '.initvector', '0.052734375']
['15', '31', '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[1], (i[2])]
writer.writerow(row)
此外,您发布的更新没有解释此代码更改如何提供十进制的十六进制数,除以 1024。需要详细说明吗?
除以 1024 只是为了获得千字节的值,同时从十六进制更改为十进制。 我决定放弃它并在 excel 中执行此类操作。
这回答了你的问题了吗? 如何将十六进制字符串转换为十六进制数字
这回答了你的问题了吗? 如何将十六进制字符串转换为十六进制数字
是的,它确实。 我现在以新的眼光看待它。
i[2]
是一个字符串,除非它看起来像数字。 尝试:
row = [i[0], i[1], "%d" %(int(i[2])/1024)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.