web-dev-qa-db-ja.com

ValueError:基数10のint()の無効なリテラル: ''

ファイルを読み込むプログラムを作成していますが、ファイルの最初の行が空白でない場合は、次の4行を読み込みます。これらの行で計算が実行されてから、次の行が読み取られます。その行が空でないなら、それは続きます。しかし、私はこのエラーを受けています:

ValueError: invalid literal for int() with base 10: ''.

最初の行を読んでいますが、それを整数に変換することはできません。

この問題を解決するために何ができますか?

コード:

file_to_read = raw_input("Enter file name of tests (empty string to end program):")
try:
    infile = open(file_to_read, 'r')
    while file_to_read != " ":
        file_to_write = raw_input("Enter output file name (.csv will be appended to it):")
        file_to_write = file_to_write + ".csv"
        outfile = open(file_to_write, "w")
        readings = (infile.readline())
        print readings
        while readings != 0:
            global count
            readings = int(readings)
            minimum = (infile.readline())
            maximum = (infile.readline())
207
Sarah Cox

記録のためだけに:

>>> int('55063.000000')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '55063.000000'

ここに持っていって...

>>> float('55063.000000')
55063.0

使わなければならない!

231
FdoBad

ファイルを反復処理してint型に変換するPythonicの方法:

for line in open(fname):
   if line.strip():           # line contains eol character(s)
       n = int(line)          # assuming single integer on each line

あなたがやろうとしていることはもう少し複雑ですが、それでも単純明快ではありません:

h = open(fname)
for line in h:
    if line.strip():
        [int(next(h).strip()) for _ in range(4)]     # list of integers

これにより、一度に5行処理されます。 Python 2.6より前のh.next()の代わりにnext(h)を使ってください。

ValueErrorを持っていたのは、intが空文字列を整数に変換できないからです。この場合は、変換前に文字列の内容を確認するか、エラーを除いて確認する必要があります。

try:
   int('')
except ValueError:
   pass      # or whatever
49
SilentGhost

以下はpythonで完全に受け入れられます:

  • 整数の文字列表現をintに渡す
  • floatの文字列表現をfloatに渡す
  • 整数の文字列表現をfloatに渡す
  • floatをintに渡す
  • 整数をfloatに渡す

しかし、 float の文字列表現をValueErrorに渡すか、整数以外の文字列表現(空の文字列を含む)を渡すと、intが得られます。 @katyhuffが先に指摘したように、floatの文字列表現をintに渡したい場合は、まずfloatに変換してから整数に変換することができます。

>>> int('5')
5
>>> float('5.0')
5.0
>>> float('5')
5.0
>>> int(5.0)
5
>>> float(5)
5.0
>>> int('5.0')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '5.0'
>>> int(float('5.0'))
5
37
Peter

理由は、空の文字列または引数としての文字列をintに渡していることです。空の文字列か、英字が含まれているかどうかを確認してください。

9
rajender kumar

このエラーが発生するのは、スペース文字を整数に変換しようとしているためです。これはまったく不可能で制限されています。そのため、このエラーが発生しています。 enter image description here

コードを確認して修正してください。正常に動作します。

4
Joish

この行に問題があります。

while file_to_read != " ":

これは空の文字列を見つけません。 1つのスペースからなる文字列を見つけます。おそらくこれはあなたが探しているものではありません。

他のみんなのアドバイスに耳を傾ける。これはあまり慣用的なPythonコードではないので、ファイルを直接反復処理するともっと明確になりますが、この問題も同様に注目に値すると思います。

3
jcdyer

簡単なファイルでこの関数(split())をテストしてください。私は同じ問題に直面していましたが、それはsplit()が正しく書かれていなかったためです(例外処理)。

3
user3446207
    readings = (infile.readline())
    print readings
    while readings != 0:
        global count
        readings = int(readings)

そのコードに問題があります。 readingsはファイルから読み込まれる新しい行です - それは文字列です。したがって、0と比較するべきではありません。さらに、 確実 それが1でない限り、整数に変換することはできません。たとえば、空の行はここでエラーになります(きっとわかっていると思いますが)。

そして、なぜあなたはグローバルカウントが必要なのですか?これは、Pythonでは最も確実に悪い設計です。

1
Eli Bendersky

ファイルを読み込むプログラムを作成していますが、ファイルの最初の行が空白でない場合は、次の4行を読み込みます。これらの行で計算が実行されてから、次の行が読み取られます。

このようなものでうまくいくはずです。

for line in infile:
    next_lines = []
    if line.strip():
        for i in xrange(4):
            try:
                next_lines.append(infile.next())
            except StopIteration:
                break
    # Do your calculation with "4 lines" here
0
Imran

私は同様のエラーを受けていました、データセットが空の値を持っていたことがわかった、それはpythonが整数に変換することができませんでした。

0
user2162611

同じファイルオブジェクトに対してループのためにreadline()を使用しようとしたときに同じ問題に遭遇しました。

最良の解決策は、seek(0)を使用してファイルポインタをリセットするか、フラグを設定して条件を処理してから、設定条件を確認して同じファイルに新しいオブジェクトを作成することです。

0
Abhishek Jain

これは、スペースで区切られた整数をリストにマップする必要があるが、.input()を使用して1行ずつ整数を入力する場合にも発生する可能性があります。たとえば、私はHackerRank Bon-Appetit でこの問題を解決していましたが、コンパイル中に次のエラーが発生しました enter image description here

そのため、プログラムに1行ずつ入力するのではなく、map()メソッドを使用して、スペースで区切られた整数をリストにマップしてみてください。

0
Amit Kumar

私は回避策を見つけました。 Pythonは数値をfloatに変換します。最初にfloatを呼び出してからそれをintに変換するだけでうまくいきます:output = int(float(input))

0
Brad123