Python mysql-connector将一些字符串转换为bytearray

时间:2016-01-22 10:53:15

标签: python mysql sql pandas mysql-connector-python

我正在使用python3和pandas连接到某个sql数据库:

import pandas as pd
import mysql.connector

cnx = mysql.connector.connect(user='me', password='***',
                          host='***',
                          database='***')
df=pd.read_sql("select id as uid,refType from user where registrationTime>=1451606400",con=cnx)
cnx.close()

我得到2列:id和refType,它们都是string类型(SQL术语中的varchar)。但是,由于某种原因,refType列被正确导入为字符串,但是uid列被导入为bytearray。 这就是他们的样子:

df.head()
                                             uid  
     

0 [49,54,54,57,55,54,50,55,64,97,110]
  1 [49,54,54,57,55,54,50,56,64,105,111]
  2 [49,48,49,53,51,50,51,50,57,53,57,5 ...
  3 [57,53,52,52,56,57,56,56,49,50,57,5 ...
  4 [49,54,54,57,55,54,50,57,64,105,111]

                                         refType  
     

0 adx_Facebook.IE_an_ph_u8 _-。cc-ch.g-f.au-ret7.c ...
  1 adx_Facebook.IE_io_ph_u4 _-。cc-gb.g-f.au-toppay ...
  2 ad_nan_1845589538__CAbroadEOScys _-。cc-ca.g-f.a ...
  3 ad_offerTrialPay-DKlvl10-1009
  4 adx_Facebook.IE_io_ph_u4 _-。cc-us.g-f.au-topspe ...

这就是uid列应该看起来的样子:

[i.decode() for i in df['uid'][1:5]]
  

[' 16697628 @ io',' 10153232959751867 @ fb',' 954489881295911 @ fb',' 16697629 @ io']

我不明白为什么它转换为bytearray,也不知道如何选择将其转换为字符串。我无法在互联网或熊猫文档中找到任何关于它或类似问题的内容。当然,我总是可以在导入后将该列转换为字符串,但这不是首选,因为显示的sql查询只是一个示例,并且在实际表中可能有数百列不正确地导入为bytearrays。在手动找到那些列并转换为字符串

的屁股中真的很痛苦

连接器本身输出相同的bytearray:

cursor = cnx.cursor()
cursor.execute('select id as uid,refType from user where registrationTime>=1451606400 LIMIT 1')
cursor.fetchall()`
  

[(bytearray(b' 16697627 @ an'),' adx_Facebook.IE_an_ph_u8 _-。cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215。 - ')

SQL数据库中列的数据类型是" Varchar(32)"对于第一列(uid)和" Varchar(128)"对于第二个(refType)

3 个答案:

答案 0 :(得分:0)

这确实很奇怪。 我想知道是否将参数“coerce_float = False”传递给read_sql函数会对这种情况有所帮助。

答案 1 :(得分:0)

也许尝试其他方法。使用Python将SQL写入CSV文件,然后将CSV文件读取到Pandas。

import pyodbc
import csv
import pandas

cnxn = pyodbc.connect('DRIVER={Server Type};SERVER=YourServer;DATABASE=YourDatabase;UID=UserId;PWD=PassWord') 
cursor = cnxn.cursor()
query = cursor.execute("select id as uid,refType from user where registrationTime>=1451606400")
List = {}
for row in cursor.fetchall():
    List.update({row.uid:row.refType})
cnxn.close()

with open('C:\\file.csv', 'wb') as the_file:
    for key,value in CurrentCommentList.items():
        the_file.write(str(key).encode('utf-8') + ','.encode('utf-8') + 
        str(value).encode('utf-8') + '\n'.encode('utf-8'))

pd.read_csv('C:\\file.csv')

答案 2 :(得分:0)

软件包“ mysql-connector”存在相同的问题。相反,安装“ mysql-connector-python”对我有用。

pip install mysql-connector-python