【发布时间】:2023-03-27 05:34:01
【问题描述】:
我在数据库中有数据,我想将其导出为 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.DictWriter 命令,您可以解码('UTF-8')您的单个单元格值并使用 DictWriter 您可以写入 csv 文件中的特定列
-
感谢您提出了一个关于新问题/关于主题/mvce 的所有指南的漂亮、简洁、写得很好的问题
-
@SuryaTej
DictWriter如何比writer更好地解决这个问题?当然,如果您知道自己的列是什么,出于其他 的原因会更好,但这并不会改变其中一些列是bytes的事实。 -
附带说明,您实际上不需要在这里执行
fetchall。您可以只迭代for row in cur:,并且游标应该一次给您一行,在内存中缓冲尽可能多的行,因为它认为最有效,而不是无论如何都将它们全部读入内存。此外,不关闭您为写入而打开的文件通常是个坏主意,无论是使用close()调用还是with语句。
标签: python python-3.x csv utf-8 export-to-csv