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


333

ファイルを読み取るプログラムを作成しています。ファイルの最初の行が空白でない場合は、次の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())

3
with open(file_to_read, 'r') as infile:そこでの使用を検討してください。
全面的

回答:


312

参考までに:

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

ここに来た...

>>> int(float('55063.000000'))
55063.0

使用する必要があります!


101
今後の読者にわかりやすくするために、int( '1.0')がValueErrorをスローしたときにint(float( '1.0'))が機能することを追加します。
katyhuff 2013

5
これが、この質問に対する受け入れられたトップの回答になるはずです。私はほとんどページを閉じました、そしてそれを見ませんでした。ありがとう!
iTurki 2016年

2
質問はint()なので、int(float( '55063.000000'))に回答に追加します。それは本当に最高の答えになるでしょう
Max

なぜこれが起こるのですか?@katyhuff
MuhamedHuseinbašić

7
この回答は質問とは関係がないようです。問題はint()、空の文字列を呼び出すときに、ValueErrorをどのように防ぐことができるかということです。「代わりにfloat()を使用」はその問題を解決しません。それでもValueErrorが発生します。
ケビン

74

以下はPythonで完全に許容されます:

  • 整数の文字列表現を渡す int
  • floatの文字列表現を渡す float
  • 整数の文字列表現を渡す float
  • フロートを渡す int
  • 整数を渡す float

しかし、あなたが得るValueErrorあなたがの文字列表現渡す場合フロートint、または何かが、(空の文字列を含む)の整数の文字列表現。int@katyhuffが上記で指摘しているように、フロートの文字列表現をに渡したい場合は、最初にフロートに変換してから整数に変換できます。

>>> 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

7
この回答は質問とは関係がないようです。問題はint()、空の文字列を呼び出すときに、ValueErrorをどのように防ぐことができるかということです。「代わりにfloat()を使用」はその問題を解決しません。それでもValueErrorが発生します。
ケビン

3
@KevinこれはOPの質問に直接答えるものではありませんが。ただし、この問題があり、気にしない人には役立ちますint(float(x))。これは、このエラーを検索するときにポップアップする最初の質問です。
Kerwin

57

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

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

4
あなたのtry / exceptは、妥当な期待できるもの(空白/空の行)と非整数のような厄介なものを区別しません。
John Machin、

そして、なぜそれらを区別したいのですか?
SilentGhost 2009

3
1つは合理的に予想可能で無視できるが、もう1つはエラーを示しているため
John Machin

3
そしてなぜ空白行は合理的に期待でき、非整数はそうではないのですか?
SilentGhost 2009

1
これは、リストが文字列化された整数のリストであることが確かな場合に適しています。できるかどうかわからない場合n = int(line) if line.is_integer() else int(float(line))
Mike Furlender '25 / 07/25

23

回避策を見つけました。Pythonは数値を浮動小数点数に変換します。最初にfloatを呼び出してから、それをintに変換するだけで機能します。 output = int(float(input))


11

その理由は、intへの引数として空の文字列または文字列を取得しているためです。空かどうか、またはアルファベット文字が含まれているかどうかを確認します。文字が含まれている場合は、その部分を無視してください。


2
これはコメントのように見えます。十分な評判がある場合は、どの投稿にもコメントできます。
ジョシュアドレイク

8

このエラーが発生する理由は、スペース文字を整数に変換しようとしているためです。これは完全に不可能であり、制限されています。そのため、このエラーが発生します。ここに画像の説明を入力してください

あなたのコードをチェックして修正してください、それはうまくいきます


8

だからあなたが持っているなら

floatInString = '5.0'

あなたはそれを変換することができますintfloatInInt = int(float(floatInString))


3

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

while file_to_read != " ":

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

みんなのアドバイスを聞いてください。これは非常に慣用的なpythonコードではなく、ファイルを直接反復処理するとはるかに明確になりますが、この問題にも注目する価値があると思います。


3

この関数(split())を単純なファイルでテストしてください。私は同じ問題に直面していて、それがsplit()適切に記述されていないためであることがわかりました(例外処理)。


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

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

そして、なぜグローバルなカウントが必要なのですか?それは間違いなくPythonの悪い設計です。


1

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

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


0

ファイルを読み取るプログラムを作成しています。ファイルの最初の行が空白でない場合は、次の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

同様のエラーが発生しました。データセットにPythonが整数に変換できない空白の値が含まれていることがわかりました。


4
OPがそれをどのように解決できるかについて、いくつかの例を挙げてもう少し詳しく説明してもらえますか?
fmendez 2013年

空白値は、文字列浮動小数点に変換できる空を意味します。floatに変換しようとすると、エラーが表示されます
saravanan saminathan

0

同じファイルオブジェクトのforループ内でreadlines()を使用しようとすると、同じ問題が発生しました...同じファイルオブジェクトのreadline()内でreadling()を起動していることが原因で、このエラーが発生しました。

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


0

私は最近これらの答えのどれもうまくいかない場合に遭遇しました。データにnullバイトが混在しているCSVデータに遭遇し、それらのnullバイトが取り除かれませんでした。したがって、私の数値文字列は、除去後、次のようなバイトで構成されていました。

\x00\x31\x00\x0d\x00

これに対抗するために、私はしました:

countStr = fields[3].replace('\x00', '').strip()
count = int(countStr)

... fieldsは、行を分割した結果のcsv値のリストです。


0

これは、測定値が空の文字列であり、明らかにエラーが発生するようです。次のように、int(readings)コマンドの前に、whileループに追加のチェックを追加できます。

while readings != 0 | readings != '':
    global count
    readings = int(readings)

0

私は実際の理由を理解するのに苦労しました、それは私たちがファイルから適切に読み取らないときに起こります。次のように、ファイルを開いてreadlines()メソッドで読み取る必要があります。

with open('/content/drive/pre-processed-users1.1.tsv') as f:
    file=f.readlines()

フォーマットされた出力を修正します


0

あなたの答えはこの行のためにエラーを投げています

readings = int(readings)
  1. ここでは、文字列をbase-10ではないint型に変換しようとしています。文字列をbase-10の場合のみintに変換できます。それ以外の場合は、ValueErrorがスローされ、base 10のint()に無効なリテラルが示されます。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.