2017-08-02 42 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]