2017-08-02 40 views
0

我有一串流式十六进制数字的文件,我需要将其转换回整数。读取数据并将其分割成线后,我有以下几点:在循环中使用int时出现无效文字

In [153]: text_lines 
Out[153]: 
['AB01D801AC01870BB6FFE000', 
'A9015F01AB01860B2600B300', 
'A901FE00AC01860BD4FF4E01', 
'AB01E700AB01850B4200DD00', 
'AA017F01AA01850B23009E00', 
'AC017D01AE01840B08004301', 
''] 

现在,如果我试图通过这些线路进行迭代,重新排列字节,并转换,我得到一个错误:

In [138]: for line in text_lines: 
    .....:  phA.append(int((line[2:4]+line[0:2]),16)) 
    .....: 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-138-eb4d5ccf5005> in <module>() 
     1 for line in text_lines: 
----> 2  phA.append(int((line[2:4]+line[0:2]),16)) 
     3 

ValueError: invalid literal for int() with base 16: '' 

但我可以毫无问题做到这一点:

In [165]: for i in range(len(text_lines)-1): 
    .....:  line = text_lines[i] 
    .....:  print int((line[2:4]+line[0:2]),16) 
    .....: 
427 
425 
425 
427 
426 
428 

我也可以打出来的第一个for循环,只是显示应放入INT()函数的文字,它看起来像刚才我期望。

In [174]: for line in text_lines: 
    .....:  print line[2:4]+line[0:2] 
    .....: 
01AB 
01A9 
01A9 
01AB 
01AA 
01AC 

任何想法,为什么迭代过线内text_lines导致int()功能打破?谢谢。

+3

错误消息告诉你为什么......你的清单 –

+0

根据从那里输入数据来的时候,你应该检查是否是喂养它之前有效的十六进制数在年底摆脱空字符串进入'int'函数。一个空字符串绝对不是一个有效的十六进制字符串。您可以先清理数据,或者简单地捕获“ValueError”异常。 –

+0

谢谢。一个愚蠢的错误。 – walkingcrane

回答

1

你的最后一个字符串为空字符串:

text_lines = ['AB01D801AC01870BB6FFE000', 
'A9015F01AB01860B2600B300', 
'A901FE00AC01860BD4FF4E01', 
'AB01E700AB01850B4200DD00', 
'AA017F01AA01850B23009E00', 
'AC017D01AE01840B08004301', 
''] # here 

而且你不能为空字符串转换为整数。

您可以使用您的filter循环之前删除空字符串:

>>> text_lines = list(filter(lambda x: x != '', text_lines)) 
>>> text_lines 
['AB01D801AC01870BB6FFE000', 'A9015F01AB01860B2600B300', 'A901FE00AC01860BD4FF4E01', 'AB01E700AB01850B4200DD00', 'AA017F01AA01850B23009E00', 'AC017D01AE01840B08004301'] 
>>> for line in text_lines: 
...  print(int(line[2:4]+line[0:2],16)) 
... 
427 
425 
425 
427 
426 
428 
+0

* facepalm * - 谢谢。需要更多的睡眠。 – walkingcrane

0

由于Irmen德容曾提到,在列表的最后摆脱你的空字符串。

更Python的方式来摆脱你的空字符串会, 无论是

text_lines=filter(None,text_lines) 

或者,
循环((列表理解))有一个条件!

>>> [int(line[2:4]+line[0:2],16) for line in text_lines if line] 
[427, 425, 425, 427, 426, 428]