2017-08-02 8 views
0

整数に変換する必要があるストリーム16進数のファイルがあります。データの読み込みや線にそれを分割した後、私は次があります。ループ内でintを使用するときに無効なリテラル

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 [153]: text_lines 
Out[153]: 
['AB01D801AC01870BB6FFE000', 
'A9015F01AB01860B2600B300', 
'A901FE00AC01860BD4FF4E01', 
'AB01E700AB01850B4200DD00', 
'AA017F01AA01850B23009E00', 
'AC017D01AE01840B08004301', 
''] 

、私はエラーを取得します

しかし、私は問題なくこれを行うことができます。

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 

私もちょうどint型()関数に入れて、それがまさに私のように見えるべきであるリテラルを表示するには、forループを最初に抜け出すことができます期待する。

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

の最後に空の文字列を取り除くを示しています、それはそれを供給する前に、有効な16進数だ場合、あなたがチェックする必要がありますint関数に変換します。空文字列は、確かに有効な16進文字列ではありません。最初にデータを消毒するか、単に「ValueError」例外を捕まえることができます。 –

+0

ありがとうございます。愚かな間違い。 – walkingcrane

答えて

1

あなたの最後の文字列は空の文字列です:

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

そして、あなたは整数に空の文字列を変換することはできません。

あなたは空の文字列を削除するには、あなたのループの前filterを使用することができます。

Irmen・デ・ヨングが言及したとおり
>>> 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

、リストの最後にあなたの空の文字列を取り除きます。 ((リスト内包))をループ

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] 
関連する問題