我遇到了一个问题,当我想把熊猫的数据保存到一个具有指定数据类型的sqlite数据库中时。我有以下module.py:
# Import from future to make Python2 behave like Python3
from __future__ import unicode_literals
import os
import pandas as pd
from sqlalchemy import create_engine
engine=create_engine('sqlite:///foo.db')
cnx = engine.raw_connection()
df_out = pd.DataFrame({'col1': ['1', '1'] ,'col2': ['1.0', '1.2'],'col3': ['A', 'B']})
labels=['col1','col2','col3']
types=['TEXT','TEXT','TEXT']
mapping={k:v for k,v in zip(labels,types)}
df_out.to_sql(name='table',if_exists='replace',con=cnx,dtype=mapping)
df_in=pd.read_sql(sql='''SELECT * FROM "table" ''',con=cnx)当我在Python解释器中运行这段代码时,我会得到以下错误消息ValueError: col2 (TEXT) not a string。
对于我所发现的,不兼容性来自于语句from __future__ import unicode_literals。删除它时,我得到了预期的行为:描述对象类型的3列的df_in.dtypes。
我尝试使用原始字符串types=[r'TEXT',r'TEXT',r'TEXT'],但它没有改变任何东西。
有没有人有解决办法或解决办法。
诚挚的问候,
发布于 2017-07-04 08:26:50
在Python2中,将来导入的unicode_literals使字符串文本的行为与Python3类似。这意味着没有前缀的字符串文本会给您一个unicode字符串:
>>> type('foo')
<type 'unicode'>如果希望使用遗留str,请使用b前缀(因为它对应于Python3的bytes字符串):
>>> type(b'foo')
<type 'str'>r前缀不影响类型。它只会在解析源代码中的字符串文本时更改解释器对待反斜杠的方式:
>>> r'\foo'
u'\\foo'
>>> '\\foo'
u'\\foo'它只是编写文字的一种不同的方式,与编写1e-2或0.01以获得相同的浮点值的方式相同。从字符串的值中,您永远无法判断它是通过r'...'或'...'符号创建的(或从文件中读取等等)。
如果要创建一个具有较少反斜杠的r前缀,可以将该str前缀与b前缀组合:
>>> br'\foo'
'\\foo'但是这并不是经常需要的,因为Python2在str和unicode之间有自动类型强制。
https://stackoverflow.com/questions/44786029
复制相似问题