python - (Python) 使用 UTF-8 编码将字符串写入 CSV

标签 python python-3.x csv utf-8 export-to-csv

我在数据库中有数据,我想将其导出到 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'

在我的研究中,我发现我的数据是用字节对象写的(可能是我错了)。我需要在没有 b''

的情况下以 UTF-8 写入数据

我知道我可以使用 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'.

解决方案是给它字符串。


最简单的方法是解码那些字节:

I know that I can use decode("UTF-8") to make it into the string, but I cannot apply that to 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 连接器/Python 默认将所有 CHARTEXT 和类似列转换为 Unicode str 值。2BINARYBLOB 和类似的列始终以 bytes 的形式返回。

如果此列旨在表示 Unicode 文本,请将其设置为文本类型而不是数据库中的二进制类型。这样一来,您就不会在这个脚本或任何其他工具中遇到问题。


<子>1。实际上,根据文档,使用除字符串和数字之外的任何列表调用它似乎是非法的。但实际上,它需要任何东西;除了字符串和数字之外,它对任何类型都没有做任何非常有用的事情……

<子>2。也就是说,除非你明确地传递给它 use_unicode=Falseconnect 调用中或类似地在其他地方设置它。

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

相关文章:

c# - C# 中的 JSON 字符串到 CSV 和 CSV 到 JSON 的转换

python - 使用 pandas 过滤数据

r - 当列名包含空格和特殊字符时从 data.table 包中读取?

python - 展平任意深度的字典

python - 递归和随机分组列表

python - 如何使用请求将 URL 中的日历选项作为 header 发送?

python - Pillow :使用 Draw.rectangle 的奇怪行为

python - 如何处理从 except block 引发的异常链

mysql - 在 Python 3.5 中导入 MySQL 连接器时出错

python - 装饰所有继承的方法