Python TypeError:/:';str';和';int';对于
我正在使用python 3.7 我的列表数据如下所示Python TypeError:/:';str';和';int';对于,python,regex,typeerror,quantifiers,Python,Regex,Typeerror,Quantifiers,我正在使用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
[['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:不支持/:'str'和'int'的操作数类型
我怎样才能解决这个问题
我已经更新了答案。感谢所有贡献
i[2]
是一个字符串,除非它看起来像数字。尝试:
row = [i[0], i[1], "%d" %(int(i[2])/1024)]
由于所有第二个索引元素都是十六进制整数,因此可以使用
int()
函数并传递16
(base 16)作为第二个参数
模块信息中的i的:
行=[i[0],i[1],“%d”%(int(i[2],16)/1024)]
writer.writerow(行)
在列表中循环并打印行
时:
lst中的i的>>:
行=[i[0],i[1],“%d”%(int(i[2],16)/1024)]
打印(行)
['file1.o','.text',0']
['file2.o','.initvector','0']
['15', '31', '0']
在每次迭代中,行
的第二个元素是“0”
,因为%d”
占位符将(int(i[2],16)/1024)
作为整数插入。如果需要完整的十进制表示形式,我建议您只插入字符串(使用“%s”
)
lst中的i的>>:
行=[i[0],i[1],“%s”%(int(i[2],16)/1024)]
打印(行)
['file1.o','.text','0.046875']
['file2.o','.initvector','0.052734375']
['15', '31', '0.111328125']
错误是在i[2]/1024
这段代码中生成的,其中i[2]
实际上被解释为字符串,而1024
被解释为int。这就是错误存在的原因
您必须将字符串转换为数字
要将十六进制字符串转换为十进制数,请使用int(i[2],16)
要将十六进制字符串转换为十进制数,请使用bin(int(i[2],16))
使用您喜欢的转换类型并使用它。我希望这能解决您的问题。我改变了解析文件和读取其内容的方式。当我只需要去掉“origin+”时,我尝试使用贪婪量词 因此,现在写入文件更改此
for i in module_info:
row = [i[0], i[1], (i[2])]
writer.writerow(row)
此外,您发布的更新没有解释此代码更改如何提供十进制十六进制数除以1024。想详细说明一下吗 用1024除法只是为了得到以千字节为单位的值,同时从十六进制改为十进制。我决定放弃它,在excel中执行这些操作
这回答了你的问题吗?如何将十六进制字符串转换为十六进制数字
这回答了你的问题吗
是的。我现在有了新的认识。您正在尝试将
'0x30'
等字符串划分为1024。你想做什么还不清楚,你没有提供足够的背景来说明你想要实现什么,这使得你不可能帮助你。是的,没错。我想得到以千字节为单位的十六进制值,这就是为什么。问题是0x30被视为字符串,而不是十六进制编号。即使我删除了除以1024。我得到“TypeError:'str'对象不可调用”这是否回答了您的问题?这与您在此接受的答案完全相同:int(hex_str,16)
:)此外,您发布的更新没有解释此代码更改如何提供十进制十六进制数除以1024。需要详细说明吗?ValueError:以10为基数的int()的文本无效:“0x30”
int(i[2],base=16)感谢您回答我的问题。我找到了另一种解决问题的方法,在文件解析过程中正确读取数据。我将用适当的评论更新我的问题。
for i in module_info:
row = [i[0], i[1], (i[2])]
writer.writerow(row)