2013-06-04 2 views
0

'10 진수로 int()에 대한 리터럴이 잘못되었습니다. '' '는 파이썬이' '을 정수로 변환 할 수 없음을 의미합니다. 그러나 나는 이미 조건을 추가했습니다 if(sh.cell_value(rowx=rx, colx=3)!=''):, 어떤 아무것도 엑셀에 포함 된 블록을 건너 뛸 수 있습니다. 누구 아이디어가 있습니까? 고마워요!밑이 10 인 int()에 대한 리터럴이 올바르지 않습니다. '

import xlrd 
book = xlrd.open_workbook("streeteasy.xls") 
sh = book.sheet_by_index(0) 
total = 0 

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
     print filter(unicode.isdigit, s) 
     print int(filter(unicode.isdigit, s)) 
     total += int(filter(unicode.isdigit, s)) 
+1

인용 한 오류 메시지가 실제 것이면 문자열이 비어 있지 않습니다. 공백이 있습니다. 또한,'if' 블록이 실행되지 않더라도, 당신은 여전히 ​​루프의 나머지 부분을 계속 수행하고's'에'int'를 호출하려고 시도합니다. – BrenBarn

+0

만약'string.strip()'을 체크하면, 그 공백을 제거 할 것입니다 ... –

+0

@BrenBarn 당신의 코멘트 후에 포스트가 닌자 편집을하지 않으면, 나는 잘못 읽은 것 같아요. '''는 빈 문자열이며 공백이 없습니다. – sepp2k

답변

1

if 블록에는 들여 쓰기가 있으므로 논리적 인 문제가 있습니다.

수정 버전 : 블록 경우 버전

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
     print filter(unicode.isdigit, s) 
     print int(filter(unicode.isdigit, s)) 
     total += int(filter(unicode.isdigit, s)) 

는, 단 하나의 문에있다, 그리고 다른 진술도 잘못된 값으로 을 실행 얻을 :

for rx in range (sh.nrows): 
    if(sh.cell_value(rowx=rx, colx=3)!=''): 
     s = sh.cell_value(rowx=rx, colx=3) 
    print filter(unicode.isdigit, s) # THIS IS NOT INSIDE IF 
    print int(filter(unicode.isdigit, s)) 
    total += int(filter(unicode.isdigit, s)) 

따라서, 코드를 빈 문자열이나 숫자가없는 문자열을 통해 실행됩니다.

>>> s = u"  " 
>>> 
>>> 
>>> filter(unicode.isdigit, s) 
u'' 
>>> int(filter(unicode.isdigit, s)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: '' 
+0

고마워! if 블록을 추가했습니다. if (u! = '') – Robert

0

다음은이 방법을 제안합니다.

for rx in range (sh.nrows): 
    try: 
     s = sh.cell_value(rowx=rx, colx=3) 
     total += int(s) 
    except ValueError: 
     if DEBUG_FLAG: 
      debug_print("problem: (%d, %d) is '%s'" % (rx, 3, s)) 

당신은 어떤이있는 경우 int() 공백을 처리 할 수 ​​있기 때문에, 셀 값에서 공백을 제거 할 필요가 없습니다. 이 값은 셀 값 '' 또는 기타 항목을 처리합니다.

너무 많이 할까봐 걱정했기 때문에 filter()을 없앴습니다. 예를 들어, 3.1415이 포함 된 셀의 경우 filter() 호출은 점을 제거하고 31415을 얻는 것이 좋습니다. 잘못 필터링하는 것보다 오류가있는 것이 좋습니다.

관련 문제