我在MS Access中有一个数据库。我试图使用pypyodbc查询一个表到Python。我收到以下错误消息:
ValueError:无法将字符串转换为float:E + 6
表中的数字相当大,最多有十位有效数字。错误消息告诉我MSAccess正在用科学计数法格式化它们,Python正在将它们作为字符串读取。
表格中的字段格式为带有两位小数的单个字符。当我在数据库中看到表中的数字时,它们没有使用科学记数法进行格式化。但错误消息似乎表明它们是。
此外,如果我将表中的数字(至少测试行)更改为小数字(整数从1到5),则运行查询。这支持了我的理论,即问题是大数字的科学格式化。
有关如何:
的任何想法答案 0 :(得分:4)
从Single
或Double
字段(列)中检索“大”或“小”数字时,这似乎是pypyodbc与Access ODBC驱动程序之间的兼容性问题,其中“大”意味着
Single
小数点左侧超过6位有效数字的值,或Double
小数点左侧超过14位有效数字和“small”表示
Single
值小于等号右边的值超过6个,或Double
值小数点右侧超过14个零当数字表示为“正常”小数时(即,不是科学记数法)。
要重新创建的代码:
import pypyodbc
cnxn = pypyodbc.connect(
r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
r"DBQ=C:\Users\Public\Database1.accdb")
crsr = cnxn.cursor()
try:
crsr.execute("DROP TABLE tblJunk")
except pypyodbc.ProgrammingError as pe:
# ignore "table does not exist"
if pe.value[0] != '42S02':
raise
crsr.execute("CREATE TABLE tblJunk (ID INT PRIMARY KEY, DoubleField DOUBLE, SingleField SINGLE)")
crsr.execute("INSERT INTO tblJunk (ID, DoubleField) VALUES (1, 12345678.9)")
crsr.execute("SELECT DoubleField, SingleField FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
print(row)
# prints: (12345678.9, None)
crsr.execute("UPDATE tblJunk SET SingleField = DoubleField WHERE ID=1")
crsr.execute("SELECT DoubleField, SingleField FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
# ValueError: could not convert string to float: E+7
解决方法1:对于Single
值,使用CDbl()
函数可以避免错误:
crsr.execute("SELECT DoubleField, CDbl(SingleField) AS foo FROM tblJunk WHERE ID=1")
row = crsr.fetchone()
print(row)
# prints: (12345678.9, 12345679.0)
解决方法2:使用CStr()
函数将值作为字符串返回,然后将其转换为float(适用于Single
和{{1} }):
Double
解决方法3:使用pyodbc代替pypyodbc。
答案 1 :(得分:0)
当我将测试文件放在一起试图重现时,我注意到表中的两个字段设置为Single类型而不是Double。将它们更改为Double,这解决了问题。 很抱歉打扰并感谢您的帮助。