dbfread報錯ValueError錯誤解決方法

李英俊小朋友發表於2019-01-17

問題

我在用dbfread處理.dbf資料的時候出現了報錯

ValueError(“could not convert string to float: b`.`”,)

然後查詢.dbf原始檔的時候,發現在報錯的那一行資料中,有一列甚至好幾列的資料中出現了`.`,裡面是否有空格忘記了,但是應該沒關係,我查閱了dbfred庫檔案中的程式碼,裡面對空格的問題已經有了很好的處理。所以這裡報錯的原因就是

string型別的`.`被認為是數值,卻無法轉換為float型別的數值,導致報錯。

原因

點選報錯的位置,錯誤資訊裡面除了有程式碼中出錯的位置之外,還有庫檔案中出錯的位置。

點選之後就可以看到,在檔案dbfread/field_parser.py中

def parseN(self, field, data):
    """Parse numeric field (N)

    Returns int, float or None if the field is empty.
    """
    # In some files * is used for padding.
    data = data.strip().strip(b`*`)

    try:
        return int(data)
    except ValueError:
        if not data.strip():
            return None
        else:
            # Account for , in numeric fields
            return float(data.replace(b`,`, b`.`))

可見在原始碼中沒有對`.`進行處理就

return float(data.replace(b`,`, b`.`))

解決方案

知道了原因之後,我們就只需要增加一個elif來對`.`進行處理就好了。

def parseN(self, field, data):
    """Parse numeric field (N)
    Returns int, float or None if the field is empty.
    """
    # In some files * is used for padding.
    data = data.strip().strip(b`*`)
    try:
        return int(data)
    except ValueError:
        if not data.strip():
            return None

        # For English: If the value is b`.`, we need return `.`, or the code will have some error.
        # For Chinese: 在我的程式碼中,有的值是`.`,然後執行了之後就報了格式錯誤,新增下面兩行程式碼可以解決這個問題,返回值是String型別的`.`
        elif data.strip() == b`.`:
            return `.`

        else:
            # Account for , in numeric fields
            return float(data.replace(b`,`, b`.`))

在裡面加入了兩行程式碼

elif data.strip() == b`.`:

    return `.`

詳情可見我在github上對修改

https://github.com/TinyHandsome/dbfread.git

展望

我想除了`.`的問題之外,可能還會有各種奇葩的問題,同樣可以通過修改庫檔案的方法,直接將無法處理的字串或資訊,轉換成你想要得到的資訊,比如我這裡是”.”到”.”,雖然都是“.”,但是結果完全不一樣,至少不會報錯,對於問題的解決也挺直接的。

希望能解決讀者的問題。有其他的問題可以通過回覆或者私聊我。

 

相關文章