2013-06-04 87 views
0

我遇到了一個問題「int()與基數10的無效文字:''」,這意味着python無法將「'轉換爲整數。但是我已經添加了一個條件if(sh.cell_value(rowx=rx, colx=3)!=''):,它可以跳過不包含任何內容的塊。有沒有人有一些想法?非常感謝你!int()與基數爲10的無效字面值:''

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

你如果塊有壓痕,因此邏輯問題。

修正版本:

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,這似乎不是一個好主意。最好有一個錯誤,而不是錯誤地過濾。

相關問題