IT story

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

hot-time 2020. 4. 9. 08:11
반응형

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


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

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

기록만을 위해서:

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

사용해야합니다!


파일을 반복하고 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

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

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

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

이유는 빈 문자열이나 문자열을 int의 인수로 받고 있기 때문에 비어 있는지 또는 알파 문자가 포함되어 있는지 또는 단순히 해당 부분을 무시하는 것보다 포함되어 있는지 확인하십시오.


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


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

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


이 줄에 문제가 있습니다.

while file_to_read != " ":

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

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


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


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

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

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


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

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


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

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

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

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


동일한 파일 객체에 대해 for 루프 내부에서 readlines ()를 사용하려고 할 때도 같은 문제가 발생했습니다. 같은 파일 객체에 대해 readline () 내부에서 readling ()을 실행하면이 오류가 발생했습니다.

최상의 해결책은 seek (0)을 사용하여 일부 플래그를 설정하여 파일 포인터 또는 핸들 조건을 재설정 한 다음 설정된 조건을 확인하여 동일한 파일에 대한 새 객체를 만듭니다 ....

참고 URL : https://stackoverflow.com/questions/1841565/valueerror-invalid-literal-for-int-with-base-10

반응형