Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Access数据库查询问题:“无法将字符串转换为浮点:E+6”_Python_Ms Access_Pypyodbc_Pyodbc - Fatal编程技术网

Python 从Access数据库查询问题:“无法将字符串转换为浮点:E+6”

Python 从Access数据库查询问题:“无法将字符串转换为浮点:E+6”,python,ms-access,pypyodbc,pyodbc,Python,Ms Access,Pypyodbc,Pyodbc,我在MS Access中有一个数据库。我正在尝试使用pyodbc将一个表查询到Python。我收到以下错误消息: ValueError:无法将字符串转换为浮点:E+6 表中的数字相当大,最多有十个有效数字。错误消息告诉我MSAccess正在用科学记数法格式化它们,而Python正在将它们作为字符串读取 表中的字段格式为带两位小数的单精度字段。当我在数据库中看到表中的数字时,它们不是使用科学符号格式化的。但错误消息似乎表明它们是正确的 此外,如果我至少将测试行的表中的数字更改为从1到5的小整数,则

我在MS Access中有一个数据库。我正在尝试使用pyodbc将一个表查询到Python。我收到以下错误消息:

ValueError:无法将字符串转换为浮点:E+6

表中的数字相当大,最多有十个有效数字。错误消息告诉我MSAccess正在用科学记数法格式化它们,而Python正在将它们作为字符串读取

表中的字段格式为带两位小数的单精度字段。当我在数据库中看到表中的数字时,它们不是使用科学符号格式化的。但错误消息似乎表明它们是正确的

此外,如果我至少将测试行的表中的数字更改为从1到5的小整数,则查询将运行。这支持了我的理论,即问题在于大数的科学格式化

关于如何:

在数据库表中写入的数字格式不是科学符号,或者 让PyODBC检索数字,并忽略任何科学符号。
当我把测试文件放在一起供您尝试复制时,我注意到表中的两个字段被设置为单类型而不是双类型。将它们改为双倍,解决了问题。
很抱歉打扰您,谢谢您的帮助。

当我正在整理测试文件供您尝试复制时,我注意到表中的两个字段被设置为单类型而不是双类型。将它们改为双倍,解决了问题。
很抱歉打扰您,谢谢您的帮助。

从单字段列或双字段列检索大数字或小数字时,这似乎是与Access ODBC驱动程序之间的兼容性问题,其中大表示

小数点左侧超过6位有效数字的单个值,或 小数点左侧超过14位有效数字的双值 小钱

小数点右侧大于6个零的单个值,或 小数点右侧有大于14个零的双精度值 当数字表示为正常小数时,即不是用科学记数法

要重新创建的代码:

导入PyODBC cnxn=pyodbc.connect rDRIVER={MicrosoftAccess驱动程序*.mdb,*.accdb}; rDBQ=C:\Users\Public\Database1.accdb crsr=cnxn.cursor 尝试: crsr.executeDROP表tblJunk 除PyODBC.ProgrammingError作为pe外: 忽略表不存在 如果pe.值[0]!='42S02': 提升 crsr.executeCREATE表tblJunk ID INT主键,双字段双字段,单字段单字段 crsr.executeINSERT到tblJunk ID,双字段值12345678.9 crsr.executeSELECT DoubleField,tblJunk中的SingleField,其中ID=1 行=crsr.fetchone 打印行 打印:12345678.9,无 crsr.executeUPDATE tblJunk SET SingleField=DoubleField,其中ID=1 crsr.executeSELECT DoubleField,tblJunk中的SingleField,其中ID=1 行=crsr.fetchone ValueError:无法将字符串转换为浮点:E+7 解决方法1:对于单个值,使用CDbl函数可以避免错误:

crsr.execute从tblJunk中选择DoubleField,CDblSingleField作为foo,其中ID=1 行=crsr.fetchone 打印行 印刷品:12345678.9、12345679.0 解决方法2:使用CStr函数以字符串形式返回值,然后将其转换为浮点值,然后对Single和Double都有效:

crsr.EXECUTE从tblJunk中选择DoubleField,CStrSingleField作为foo,其中ID=1 行=crsr.fetchone 打印行 印刷品:12345678.9,u'1.234568E+07' printfloatrow[1] 印刷品:12345680.0
解决方法3:使用而不是PyODBC。

从单字段或双字段列检索大或小数字时,这似乎是与Access ODBC驱动程序之间的兼容性问题,其中大表示

小数点左侧超过6位有效数字的单个值,或 小数点左侧超过14位有效数字的双值 小钱

小数点右侧大于6个零的单个值,或 小数点右侧有大于14个零的双精度值 当数字表示为正常小数时,即不是用科学记数法

要重新创建的代码:

导入PyODBC cnxn=pyodbc.connect rDRIVER={MicrosoftAccess驱动程序*.mdb,*.accdb}; rDBQ=C:\Users\Public\Database1.accdb crsr=cnxn.cursor 尝试: crsr.executeDROP表tblJunk 除PyODBC.ProgrammingError作为pe外: 忽略表不存在 如果pe.值[0]!='42S02': 提升 crsr.executeCREATE表tblJunk ID INT主键,双字段双字段,单字段单字段 crsr.executeINSERT到tblJunk ID,双字段值12345678.9 crsr.executeSELECT DoubleField,tblJunk中的SingleField,其中ID=1 行=crsr.fetchone 打印行 打印:12345678.9,无 crsr.executeUPDAT E tblJunk集合单字段=双字段,其中ID=1 crsr.executeSELECT DoubleField,tblJunk中的SingleField,其中ID=1 行=crsr.fetchone ValueError:无法将字符串转换为浮点:E+7 解决方法1:对于单个值,使用CDbl函数可以避免错误:

crsr.execute从tblJunk中选择DoubleField,CDblSingleField作为foo,其中ID=1 行=crsr.fetchone 打印行 印刷品:12345678.9、12345679.0 解决方法2:使用CStr函数以字符串形式返回值,然后将其转换为浮点值,然后对Single和Double都有效:

crsr.EXECUTE从tblJunk中选择DoubleField,CStrSingleField作为foo,其中ID=1 行=crsr.fetchone 打印行 印刷品:12345678.9,u'1.234568E+07' printfloatrow[1] 印刷品:12345680.0
解决方法3:使用pyodbc代替pyodbc。

确实如此。我只是在Access表中的数字字段中添加了10位十进制数字,并对DSN和驱动程序连接使用了PyODBC和adodbapi,但无法重新创建问题。默认情况下,Access不会像sci符号中的Excel那样截断大数字。可能您的字段也是如此。@Parfait-可能您的字段格式为[scientific notation]。-好主意,除了ODBC不注意Access中的格式选项;它只返回原始数字。不过,我还是很高兴听到,我不是唯一一个不能重现这个问题的人。我真的很想知道在这样的情况下会发生什么。在数据库表中写入数字时,数字不会以sci表示法格式化——数字永远不会以科学表示法存储;它们仅在科学记数法中格式化为数字的字符串表示形式。也就是说,所有单个值都以相同的方式存储在数据库中,因此从来没有出现过某些值以科学符号存储,而其他值则不以科学符号存储的情况。我只是在Access表中的数字字段中添加了10位十进制数字,并对DSN和驱动程序连接使用了PyODBC和adodbapi,但无法重新创建问题。默认情况下,Access不会像sci符号中的Excel那样截断大数字。可能您的字段也是如此。@Parfait-可能您的字段格式为[scientific notation]。-好主意,除了ODBC不注意Access中的格式选项;它只返回原始数字。不过,我还是很高兴听到,我不是唯一一个不能重现这个问题的人。我真的很想知道在这样的情况下会发生什么。在数据库表中写入数字时,数字不会以sci表示法格式化——数字永远不会以科学表示法存储;它们仅在科学记数法中格式化为数字的字符串表示形式。也就是说,所有单个值都以相同的方式存储在数据库中,因此从来没有出现过某些值以科学记数法存储,而其他值则不以科学记数法存储的情况。感谢Gord,这是非常有用的信息。我自己的解决方案实际上只是另一种解决方法,以防我可以使用双精度而不是单精度类型。我只是很高兴事情进展顺利,然后继续前进,没有考虑太多。但一定要记住这个限制。关于pyodbc与pyodbc,使用后者的唯一原因是它是纯Python。我正在一个公司系统中工作,如果说安装pyodbc有点像噩梦的话。谢谢Gord,这是非常有用的信息。我自己的解决方案实际上只是另一种解决方法,以防我可以使用双精度而不是单精度类型。我只是很高兴事情进展顺利,然后继续前进,没有考虑太多。但一定要记住这个限制。关于pyodbc与pyodbc,使用后者的唯一原因是它是纯Python。我正在一个公司系统中工作,如果有点像噩梦的话,我正在安装pyodbc。