【问题标题】:python, You must not use 8-bit bytestringspython,您不能使用 8 位字节串
【发布时间】:2014-09-15 07:12:02
【问题描述】:

我正在将 python 中的 SQL 查询转换为 pandas 数据框。然后我使用 pandas sql 在两个 pandas 数据框之间进行左外连接。 我的代码是:

import MySQLdb as mdb
from pandasql import sqldf
from collections import OrderedDict
from pandas import DataFrame
import pandas as pd

top_name_gender = [['Nicole','female'],['Jerson','male'],['Kim','female']]

gender = OrderedDict()
gender['first_name'] = []
gender['gender'] = []

for row in top_name_gender:
    gender['first_name'].append(row[0])
    gender['gender'].append(row[1])


gender_df = DataFrame(gender)

customer = OrderedDict()
customer['email'] = []
customer['first_name'] = []
customer['gender'] = []

query_customer = """SELECT 
                    email,
                    lower(substring_index(first_name,' ',1)) as first_name,
                    gender 
                    FROM bob_live.customer 
                    limit 10000000000"""

con = mdb.connect(host='db03.phlan', port=3306, user='crm', passwd='.....', db='bob_live')
cur = con.cursor()                  
cur.execute(query_customer)
for row in cur.fetchall():
        customer['email'].append(row[0])
        customer['first_name'].append(row[1])
        customer['gender'].append(row[2])

customer_df = DataFrame(customer)

query1 = """"
                    select customer_df.*, gender_df.*
                    from customer_df
                    left outter join gender_df
                    on customer_df.first_name = gender_df.first_name"""

joined = sqldf(query1,locals())
joined.text_factory = str

但我有以下错误:

sqlite3.ProgrammingError: 你不能使用 8 位字节串,除非 您使用可以解释 8 位字节串的 text_factory(例如 text_factory = str)。强烈建议您改为 将您的应用程序切换到 Unicode 字符串

我尝试添加

con.text_factory = str
cur.text_factory = str  

但它不会改变任何东西。

有什么建议吗?

【问题讨论】:

  • 您是否粘贴了您拥有的确切代码?在这种情况下,这里有奇数符号 '"':query1 = """"
  • 试试这个:joined.text_factory = unicode 或者这个:query1 = u"""...
  • 感谢@stalk 的评论,我都试过了,但都不起作用
  • 您从 sql 数据库中读取它的事实在这里并不重要(顺便说一句,如果您为此使用 pd.read_sql_query 会更容易),因此您可以忽略它。您能否也给出一个可重现的 customer_df 示例,它给出了错误?
  • 嗨 @joris 感谢您的回答和建议(我现在正在使用 read_sql_query),那么 customer_df 没有给我任何错误

标签: python sql encoding pandas


【解决方案1】:

原来我的问题在于我试图合并的数据框中的文本。调用 read_csv 时指定正确的编码就足够了:例如encoding='latin-1'

【讨论】:

  • 记录在案 - 这解决了我在 pandas 0.17.1 中的问题
猜你喜欢
  • 1970-01-01
  • 2011-02-19
  • 2011-08-02
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
相关资源
最近更新 更多