首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫to_sql为sqlite强制使用dtype -与unicode_literals不兼容

熊猫to_sql为sqlite强制使用dtype -与unicode_literals不兼容
EN

Stack Overflow用户
提问于 2017-06-27 17:04:35
回答 1查看 1.4K关注 0票数 0

我遇到了一个问题,当我想把熊猫的数据保存到一个具有指定数据类型的sqlite数据库中时。我有以下module.py:

代码语言:javascript
复制
# 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'],但它没有改变任何东西。

有没有人有解决办法或解决办法。

诚挚的问候,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-04 08:26:50

在Python2中,将来导入的unicode_literals使字符串文本的行为与Python3类似。这意味着没有前缀的字符串文本会给您一个unicode字符串:

代码语言:javascript
复制
>>> type('foo')
<type 'unicode'>

如果希望使用遗留str,请使用b前缀(因为它对应于Python3的bytes字符串):

代码语言:javascript
复制
>>> type(b'foo')
<type 'str'>

r前缀不影响类型。它只会在解析源代码中的字符串文本时更改解释器对待反斜杠的方式:

代码语言:javascript
复制
>>> r'\foo'
u'\\foo'
>>> '\\foo'
u'\\foo'

它只是编写文字的一种不同的方式,与编写1e-20.01以获得相同的浮点值的方式相同。从字符串的值中,您永远无法判断它是通过r'...''...'符号创建的(或从文件中读取等等)。

如果要创建一个具有较少反斜杠的r前缀,可以将该str前缀与b前缀组合:

代码语言:javascript
复制
>>> br'\foo'
'\\foo'

但是这并不是经常需要的,因为Python2在strunicode之间有自动类型强制。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44786029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档