我正在使用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)
答案 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