在 Python 中打印 varbinary 数据 从 mysql 连接器查询中检索

Printing varbinary data in Python retrieve from mysql-connector query

感谢您在 Whosebug 中分享的所有知识。

我在使用 Python3 和 mysql_connector 库打印从 MySQL 数据库检索到的 varbinary 数据时遇到问题。 varbinary 列 (RawTxt) 在 MySQL 中存储为 varbinary,在 Python.

中检索时显示为方括号 [] 中的数字列表

我会先投射然后打印吗?我尝试将“ charset='utf8' ”参数添加到连接变量,但无济于事。不确定它是否是字符集/编解码器问题。这似乎有点专业,因为我在互联网上找不到太多关于它的信息。

下面是代码,使用 df.head() 打印,然后使用 df.to_csv

发送到 .csv 文件时的样子

代码:

import mysql.connector as mysql
import pandas as pd

dbconn = mysql.connect(
    host = '1234.com',
    user = 'root',
    password = '1234',
    database = 'tq_verbatims'
)

dbcursor = dbconn.cursor()
dbcursor.execute("""
SELECT a.RawID, b.RawTxt, c.GibberishOdds, a.cntResp 
FROM tq_verbatims.tblRawSpellingsCoded a, tq_verbatims.tblRawSpellings b, tq_verbatims.tblGibberishOdds c 
WHERE a.RawID = b.RawID AND b.SanitizedRawID = c.SanitizedRawID;
"""
)

tblRawSpellingCoded = dbcursor.fetchall()
df = pd.DataFrame(tblRawSpellingCoded, columns=dbcursor.column_names)
df.to_csv (r'C:\Users\export_dataframe.csv', index = False, header=True)
df.head()

df.head() 结果:

  RawID   RawTxt      GibberishOdds   cntResp
0   116 [40, 85, 78, 75, 78, 79, 87, 78, 41]    0.050513    1
1   237 [46, 46, 46, 46, 46, 46]    2.718280    1
2   284 [46, 78, 79, 84, 32, 83, 85, 82, 69]    0.079919    1
3   585 [51, 32, 77]    2.718280    6
4   658 [51, 77]    2.718280    403

在 .csv 文件中,RawTxt 字段在 .csv 文件输出中显示为 bytearray(b'(UNKOWN)'),它应该只有文本 'UNKNOWN'。这 4 行的 RawTxt 实际数据是 'UNKNOWN', '......', 'NOT SURE', '3 M'

RawID, RawTxt, GibberishOdds, cntResp
116,bytearray(b'(UNKNOWN)'),0.0505134,1
237,bytearray(b'......'),2.71828,1
284,bytearray(b'.NOT SURE'),0.0799194,1
585,bytearray(b'3 M'),2.71828,6

提前致谢。

RawTxt 字段被导出为 bytearray 的原因是因为 cursor 将该字段中的值作为 bytearray 值返回。在不知道表的确切架构的情况下,很难说出为什么 RawTxtmysql-connector 包转换为 bytearray

无论如何,如果您确定 RawTxt 包含有效的字符串值,那么您可以在将数据传递给 Pandas 之前或之后将这些值转换为字符串。

Pandas之前:
import mysql.connector as mysql
import pandas as pd

dbconn = mysql.connect(
    host = '1234.com',
    user = 'root',
    password = '1234',
    database = 'tq_verbatims'
)

dbcursor = dbconn.cursor()
dbcursor.execute("""
SELECT a.RawID, b.RawTxt, c.GibberishOdds, a.cntResp 
FROM tq_verbatims.tblRawSpellingsCoded a, tq_verbatims.tblRawSpellings b, tq_verbatims.tblGibberishOdds c 
WHERE a.RawID = b.RawID AND b.SanitizedRawID = c.SanitizedRawID;
"""
)
tblRawSpellingCoded = []
for row in dbcursor.fetchall():
    row[1] = row[1].decode('utf8')
    tblRawSpellingCoded.append(row)
df = pd.DataFrame(tblRawSpellingCoded, columns=dbcursor.column_names)
df.to_csv (r'C:\Users\export_dataframe.csv', index = False, header=True)
df.head()
Pandas之后:
import mysql.connector as mysql
import pandas as pd

dbconn = mysql.connect(
    host = '1234.com',
    user = 'root',
    password = '1234',
    database = 'tq_verbatims'
)

dbcursor = dbconn.cursor()
dbcursor.execute("""
SELECT a.RawID, b.RawTxt, c.GibberishOdds, a.cntResp 
FROM tq_verbatims.tblRawSpellingsCoded a, tq_verbatims.tblRawSpellings b, tq_verbatims.tblGibberishOdds c 
WHERE a.RawID = b.RawID AND b.SanitizedRawID = c.SanitizedRawID;
"""
)

tblRawSpellingCoded = dbcursor.fetchall()
df = pd.DataFrame(tblRawSpellingCoded, columns=dbcursor.column_names)
df.RawTxt = df.RawTxt.str.decode('utf8')
df.to_csv (r'C:\Users\export_dataframe.csv', index = False, header=True)
df.head()

任一解决方案都应将 RawTxt 值从 bytearray 值转换为 string,并假设这些值是有效的字符串值。