問題
我在用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
展望
我想除了`.`的問題之外,可能還會有各種奇葩的問題,同樣可以通過修改庫檔案的方法,直接將無法處理的字串或資訊,轉換成你想要得到的資訊,比如我這裡是”.”到”.”,雖然都是“.”,但是結果完全不一樣,至少不會報錯,對於問題的解決也挺直接的。
希望能解決讀者的問題。有其他的問題可以通過回覆或者私聊我。