在我开始之前,让我说我对编程很陌生,所以请不要杀了我。
作为练习,我编写了一个脚本,该脚本应该从txt中获取十六进制数列表,将它们转换为十进制并将它们写入另一个文件。这就是我想出的:
hexdata = open(raw_input("Sourcefile:")).read().split(',')
dec_data = []
print hexdata
x = -1
for i in hexdata:
next_one = hexdata.pop(x+1)
decimal = int(next_one, 16)
print "Converting: ", next_one, "Converted:", decimal
dec_data.append(decimal)
print dec_data
target = open(raw_input("Targetfile: "), 'w')
for n in dec_data:
output = str(n)
target.write(output)
target.write(",")
当我运行脚本时,它完成没有错误但是它只转换并写入源文件中的前30个数字并忽略所有其他数字,即使它们被加载到'hexdata'列表中。我尝试了几种变化,但它从不适用于所有数字(48)。我做错了什么?
答案 0 :(得分:5)
您的第一个循环是尝试迭代hexdata,同时使用hexdata.pop()将值拉出列表。只需将其更改为:
for next_one in hexdata:
decimal = int(next_one, 16)
print "Converting: ", next_one, "Converted:", decimal
dec_data.append(decimal)
答案 1 :(得分:1)
迭代列表时的原则是不修改您要迭代的列表。如果必须,您可以复制列表以进行迭代。
for i in hexdata[:]: # this creates a shallow copy, or a slice of the entire list
next_one = hexdata.pop(x+1)
decimal = int(next_one, 16)
print "Converting: ", next_one, "Converted:", decimal
dec_data.append(decimal)
您还可以使用copy.deepcopy
创建深层副本,这样您就可以避免在浅层副本中出现问题,例如hexdata[:]
。