ValueError : 기본 10 인 int ()에 대한 잘못된 리터럴 : ''


333

파일을 읽는 프로그램을 만들고 있는데 파일의 첫 줄이 비어 있지 않으면 다음 네 줄을 읽습니다. 해당 행에 대해 계산을 수행 한 후 다음 행을 읽습니다. 해당 줄이 비어 있지 않으면 계속 진행됩니다. 그러나이 오류가 발생합니다.

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:거기에서 사용하는 것이 좋습니다.
Omnifarious

답변:


311

기록만을 위해서:

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

5
이것은이 질문에 대해 가장 많이 받아 들여 져야합니다. 나는 페이지를 거의 닫았지만 보지 못했습니다. 감사!
iTurki 2016 년

2
질문에 get int ()를 입력하여 int (float ( '55063.000000'))에 추가하십시오. 실제로 가장 큰 답이 될 것입니다
Max

왜 이런 일이 발생합니까? @katyhuff
Muhamed Huseinbašić 2016 년

7
이 답변은 질문과 관련이없는 것으로 보입니다. int()빈 문자열 을 호출 할 때 ValueError를 방지하는 방법에 대한 질문입니다 . "float () 사용"대신 해당 문제가 해결되지 않습니다. 여전히 ValueError가 발생합니다.
Kevin

74

다음은 파이썬에서 완전히 허용됩니다.

  • 정수의 문자열 표현을 int
  • float의 문자열 표현을 float
  • 정수의 문자열 표현을 float
  • 플로트를 int
  • 정수를 전달 float

그러나 당신은 얻을 ValueError당신이의 캐릭터 라인 표현 전달하면 플로트int, 또는 아무것도의 문자열 표현하지만 (빈 문자열 포함)의 정수를. int@katyhuff가 위에서 지적한 것처럼 float의 문자열 표현을에 전달 하려면 먼저 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

7
이 답변은 질문과 관련이없는 것으로 보입니다. int()빈 문자열 을 호출 할 때 ValueError를 방지하는 방법에 대한 질문입니다 . "float () 사용"대신 해당 문제가 해결되지 않습니다. 여전히 ValueError가 발생합니다.
Kevin

3
@Kevin 이것은 OP의 질문에 직접 대답하지는 않지만. 그러나이 문제가 있고 int(float(x)). 이 오류를 검색 할 때 가장 먼저 나타나는 질문입니다.
Kerwin Sneijders

57

파일을 반복하고 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 개의 라인을 처리합니다. 사용 h.next()하는 대신 next(h)파이썬 2.6 이전.

당신이 한 이유는 ValueError때문이다 int정수에 빈 문자열을 변환 할 수 없습니다. 이 경우 변환하기 전에 문자열의 내용을 확인하거나 오류를 제외해야합니다.

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

4
시도 / 제외는 합리적인 기대치 (빈 / 빈 줄)와 정수가 아닌 것과 같은 불쾌한 것을 구별하지 않습니다.
John Machin

왜 그런 것들을 구별하고 싶습니까?
SilentGhost 2009

3
하나는 합리적으로 기대할 수 있고 무시할 수 있지만 다른 하나는 오류를 나타냅니다
John Machin

3
빈 줄이 합리적으로 기대할 수 있고 정수가 아닌 이유는 무엇입니까?
SilentGhost 2009

1
목록이 실제로 문자열로 된 정수 목록 인 경우에 좋습니다. 확실하지 않다면n = int(line) if line.is_integer() else int(float(line))
Mike Furlender

23

해결 방법을 찾았습니다. 파이썬은 숫자를 실수로 변환합니다. float를 먼저 호출 한 다음 int로 변환하면 다음과 같이 작동합니다. output = int(float(input))


11

그 이유는 빈 문자열이나 문자열을 int의 인수로 받기 때문입니다. 비어 있거나 알파벳 문자가 포함되어 있는지 확인하십시오. 문자가 포함되어 있으면 해당 부분을 무시하십시오.


2
이것은 댓글처럼 보입니다. 평판이 충분하면 모든 게시물에 댓글을 달 수 있습니다.
Joshua Drake

8

이 오류가 발생하는 이유는 공백 문자를 정수로 변환하려고 시도하기 때문에 완전히 불가능하고 제한되어 있기 때문에이 오류가 발생하는 것입니다.여기에 이미지 설명을 입력하십시오

코드를 확인하고 수정하면 제대로 작동합니다.


8

당신이 가지고 있다면

floatInString = '5.0'

당신은로 변환 할 수 있습니다 intfloatInInt = int(float(floatInString))


3

이 줄에 문제가 있습니다.

while file_to_read != " ":

빈 문자열이 없습니다. 하나의 공백으로 구성된 문자열을 찾습니다. 아마도 이것은 당신이 찾고있는 것이 아닙니다.

다른 사람의 조언을 들어라. 이것은 관용적 인 파이썬 코드는 아니며 파일을 직접 반복하면 훨씬 명확하지만이 문제는 주목할 가치가 있다고 생각합니다.


3

split()간단한 파일 에서이 기능 ( )을 테스트 하십시오. 나는 같은 문제에 직면하고 split()있었고 제대로 작성되지 않았기 때문에 발견되었습니다 (예외 처리).


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

해당 코드에 문제가 있습니다. readings파일에서 읽은 새 줄입니다. 문자열입니다. 따라서 0과 비교해서는 안됩니다. 또한 실제로 확실 하지 않은 경우 정수로 변환 할 수 없습니다 . 예를 들어 빈 줄은 여기에서 확실하게 오류를 생성합니다.

왜 글로벌 카운트가 필요한가요? 그것은 파이썬에서 가장 나쁜 디자인입니다.


1

공백으로 구분 된 정수를 목록에 매핑해야하지만을 사용하여 한 줄씩 정수를 입력 할 때도 발생할 수 있습니다 .input(). 예를 들어 HackerRank Bon-Appetit 에서이 문제를 해결 하고 컴파일 중 다음 오류가 발생했습니다. 여기에 이미지 설명을 입력하십시오

따라서 한 줄씩 프로그램에 입력하는 대신 공백으로 구분 된 정수를 map()메소드를 사용하여 목록으로 매핑하십시오 .


0

파일을 읽는 프로그램을 만들고 있는데 파일의 첫 줄이 비어 있지 않으면 다음 네 줄을 읽습니다. 해당 행에 대해 계산을 수행 한 후 다음 행을 읽습니다.

이와 같은 것이 작동해야합니다.

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

비슷한 오류가 발생하여 데이터 세트에 파이썬이 정수로 변환 할 수없는 빈 값이 있음이 밝혀졌습니다.


4
OP가 어떻게 해결할 수 있는지에 대한 몇 가지 예를 좀 더 자세히 설명해 주시겠습니까?
fmendez

공백 값은 공백을 의미하며 문자열 부동으로 변환 할 수 있습니다. 당신이 떠로 변환하려고하면이 오류가 표시됩니다
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. 여기서 문자열을 10이 아닌 int 유형으로 변환하려고합니다. 기본 10 인 경우에만 문자열을 int로 변환 할 수 있습니다. 그렇지 않으면 10을 가진 int ()에 대한 잘못된 리터럴을 나타내는 ValueError가 발생합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.