Sto usando python3 e panda di connettersi ad alcuni database SQL:Python mysql-connector converte alcune stringhe in ByteArray
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()
sto ottenendo 2 colonne: id e refType, entrambi sono di tipo stringa (varchar nella terminologia SQL). Tuttavia, per qualche motivo, refType colonna viene correttamente importata come stringa, ma la colonna uid viene importata come bytearray. Questo è il loro aspetto:
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.gf.au-ret7.c ...
1 adx_Facebook.IE_io_ph_u4 _-. Cc-gb.gf.au-toppay ...
2 ad_nan_1845589538__CAbroadEOScys_- .cc-ca.gf.a ...
3 ad_offerTrialPay-DKlvl10-1009
4 adx_Facebook.IE_io_ph_u4 _-. cc-us.gf.au-topspe ...
Ed è così uid colonna dovrebbe guardare:
[i.decode() for i in df['uid'][1:5]]
[ '16.697.628 @ io', '10153232959751867 @ fb', '954.489.881.295.911 @ fb', '16.697.629 @ io']
non capisco né perché è stato convertito in ByteArray né come scegliere di convertirlo in stringa. Non ho trovato nulla a riguardo o domande simili nella documentazione di internet o di panda. Ovviamente, posso sempre convertire quella colonna in stringa dopo l'importazione, ma non è preferibile, perché la query sql mostrata è solo un esempio, e nella tabella reale ci possono essere centinaia di colonne che potrebbero essere importate erroneamente come bytearrays. Sarebbe vero rompicoglioni per trovare manualmente le colonne e convertire in stringa
Il connettore stesso emette lo stesso ByteArray:
cursor = cnx.cursor()
cursor.execute('select id as uid,refType from user where registrationTime>=1451606400 LIMIT 1')
cursor.fetchall()`
[(ByteArray (b'16697627 @ un '), 'adx_Facebook.IE_an_ph_u8 _-. cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215.-'
i tipi di dati delle colonne di database SQL) sono "Varchar (32) "per la prima colonna (uid) e" Varchar (128) "per la seconda (refType)
Forse un problema con mysql.connector. Vedi https://dev.mysql.com/doc/relnotes/connector-python/en/news-2-0-0.html.Puoi mostrare quale sia il valore di ritorno da un semplice execute/fetch: 'cursor = cnx.cursor(); cursor.execute ('SELECT ... LIMIT 1'); cursor.fetchall() '? – joris
hai ragione, il connettore fornisce anche '[(bytearray (b'16697627 @ an '),' adx_Facebook.IE_an_ph_u8 _-. Cc-ch.gf.au-ret7.cr-cys.dt-all.csd-291215. - ') ' –
Puoi provare a utilizzare SQLAlchemy? (crea un motore e passa questo a 'read_sql' invece di' cnx') – joris