我正在使用 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,它们都是字符串类型(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,也不明白如何选择将它转换成string。我在互联网或 Pandas 文档中找不到任何关于它或类似问题的信息。当然,我总是可以在导入后将该列转换为字符串,但这不是首选,因为所示的 sql 查询只是一个示例,在实际表中可能有数百列会被错误地导入为字节数组。手动查找这些列并将其转换为字符串真的很痛苦
连接器本身输出相同的字节数组:
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.g-f.au-ret7.cr-cys.dt-all.csd-291215.-')
SQL数据库中列的数据类型第一列(uid)为“Varchar(32)”,第二列(refType)为“Varchar(128)”
最佳答案
包“mysql-connector”也有同样的问题。安装“mysql-connector-python”反而对我有用。
pip install mysql-connector-python
关于Python mysql-connector 将一些字符串转成bytearray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944952/