dbfread报错ValueError错误解决方法
问题
我在用dbfread处理.dbf数据的时候出现了报错
valueerror("could not convert string to float: b'.'",)
然后查找.dbf源文件的时候,发现在报错的那一行数据中,有一列甚至好几列的数据中出现了'.',里面是否有空格忘记了,但是应该没关系,我查阅了dbfred库文件中的代码,里面对空格的问题已经有了很好的处理。所以这里报错的原因就是
string类型的'.'被认为是数值,却无法转换为float类型的数值,导致报错。
原因
点击报错的位置,错误信息里面除了有代码中出错的位置之外,还有库文件中出错的位置。
点击之后就可以看到,在文件/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
展望
我想除了'.'的问题之外,可能还会有各种奇葩的问题,同样可以通过修改库文件的方法,直接将无法处理的字符串或信息,转换成你想要得到的信息,比如我这里是"."到".",虽然都是“.”,但是结果完全不一样,至少不会报错,对于问题的解决也挺直接的。
希望能解决读者的问题。有其他的问题可以通过回复或者私聊我。
上一篇: 你看雪人都有八块腹肌了,你的呢?
下一篇: 收集的博客网址
推荐阅读
-
安装cad提示1606错误怎么办 autocad报错1606的解决方法
-
dbfread报错ValueError错误解决方法
-
“incorrect super block” FreeBSD挂载CDROM时报错误的解决方法
-
Win10 20H2更新报错怎么办 Win10 20H2更新错误的9种解决方法
-
MySQL登录报错提示ERROR 1045 (28000)错误的解决方法(图文)
-
mysql服务无法启动报错误1067解决方法(mysql启动错误1067 )_MySQL
-
Oracle连接字符串报错误ORA-01722:无效数字的解决方法
-
dbfread报错ValueError错误解决方法
-
安装sqlserver 2008 最后一步报错 2337错误;解决方法。
-
MySQL登录报错提示ERROR 1045 (28000)错误的解决方法(图文)