我在数据库中有数据,我想将其导出到CSV文件。
数据是日文的,为了进一步使用,我需要用UTF-8编码
这是我获取数据并写入CSV文件的脚本

import mysql.connector
from mysql.connector import errorcode

import sys
import csv

query = 'SELECT * FROM `images-data`'

try:
    cnx = mysql.connector.connect(user='root', password='1234',
                                 host='127.0.0.1',
                                 database='sotsuken-test-db')
    cur=cnx.cursor()
    cur.execute(query)
    result=cur.fetchall()

    c = csv.writer(open("db-data.csv","w"))
    for row in result:
        c.writerow(row)



except mysql.connector.Error as err:
    if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
        print("Something is wrong with your user name or password")
    elif err.errno == errorcode.ER_BAD_DB_ERROR:
        print("Database does not exist")
    else:
        print(err)
else:
    cnx.close()

我可以创建CSV文件,数据以UTF-8格式导出,但我的CSV文件的数据是这样的:
1,b'\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88\xe3\x81\xa7\xe3\x81\x94\xe3\x81\x8a\xe3\x81\x96\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99'

在我的研究中,我发现我的数据是用字节对象写的(可能我错了)。我需要用UTF-8写数据,不需要b''
我知道我可以使用decode("UTF-8")将其转换成字符串,但我不能将其应用于csv.writerow
你能给我一些建议吗?

最佳答案

csv.writer.writerow只需列出您所拥有的一切,在每个元素上调用1个str,并将它们组合成一行CSV。
所以,如果你得到的是bytes对象,那么它将对它们调用str并得到类似b'\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88\xe3\x81\xa7\xe3\x81\x94\xe3\x81\x8a\xe3\x81\x96\xe3\x81\x84\xe3\x81\xbe\xe3\x81\x99'的字符串。
解决办法是给它加上字符串。
最简单的方法是解码这些bytes
我知道我可以使用decode("UTF-8")将其转换成字符串,但我不能将其应用于csv.writerow
当然可以。我不知道你们的专栏是什么,所以我将自己编一个例子:

for image_id, image_name in result:
    c.writerow([image_id, image_name.decode('UTF-8')])

这就是它的全部。
如果您的代码完全不知道数据库中的列是什么呢?好吧,那样的话,你得聪明一点。只要我们知道所有bytes列实际上都是伪装成UTF-8的Unicode文本,就可以打开类型:
for row in result:
    textrow = [col.decode('UTF-8') if isinstance(col, bytes) else col for col in row]
    csv.writerow(textrow)

这有点难看,但是从一个不知道列是什么的数据库中读取*本身就是一个难看的问题。
不过,也许有更好的解决办法。
MySQL Connector/Python默认情况下会将所有CHARTEXT和类似的列转换为Unicodestr值。2但BINARYBLOB和类似的列始终返回为bytes
如果此列表示Unicode文本,请在数据库中将其设置为文本类型,而不是二进制类型。那么在这个脚本中,或者在任何其他工具中,您都不会有问题。
一。实际上,根据文档,用字符串和数字以外的任何内容的列表调用它似乎是非法的。但实际上,它需要任何东西;除了字符串和数字之外,它对任何类型都没有什么用处…
2。也就是说,除非您在use_unicode=False调用中显式地传递它一个connect,或者类似地在其他地方设置它。

关于python - (Python)使用UTF-8编码将字符串写入CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51646231/

10-16 12:59