问题描述
我使用的是 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)]