Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(Python)使用UTF-8编码将字符串写入CSV_Python_Python 3.x_Csv_Utf 8_Export To Csv - Fatal编程技术网

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

(Python)使用UTF-8编码将字符串写入CSV,python,python-3.x,csv,utf-8,export-to-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', pass

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

你能给我一些建议吗?

只需列出你所拥有的一切,对每个元素调用
str
,并将它们组合成一行CSV

因此,如果您得到的是
字节
对象,那么它将调用它们上的
str
,并获取字符串,如
b'\xe3\x83\x83\x86\xe3\x82\xb9\xe3\x83\x88\xe3\x81\x81\x94\xe3\x81\x8a\xe3\x81\x96\xe3\x81\x84\xe3\x81\x99'

解决办法是给它加上字符串


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

我知道我可以使用
decode(“UTF-8”)
将其转换为字符串,但我无法将其应用于
csv.writerow

当然可以。我不知道你们的专栏是什么,所以我将自己编一个例子:

for image_id, image_name in result:
    c.writerow([image_id, image_name.decode('UTF-8')])
这就是一切


如果您的代码完全不知道数据库中的列是什么呢?嗯,那样的话,你得聪明一点。只要我们知道所有的
字节
列实际上都是伪装成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默认情况下将所有
CHAR
TEXT
和类似列转换为Unicode
str
值。2但是
二进制
BLOB
和类似列始终以
字节
的形式返回

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


一,。事实上,根据文档的说法,用除了字符串和数字以外的任何东西的列表来调用它似乎是非法的。但实际上,它需要任何东西;除了字符串和数字之外,它对任何类型都没有任何用处


二,。也就是说,除非您在
connect
调用中显式地传递它a,或者在其他地方类似地设置它。

为什么不使用csv.DictWriter命令,您可以解码('UTF-8')您的单个单元格值,并使用DictWriter您可以写入csv文件中的特定列谢谢您的友好、周到的,关于新问题/主题的所有指导原则的书面问题/mvce@SuryaTej
DictWriter
如何比
writer
更好地解决这个问题?当然,如果您知道列是什么,出于其他原因,它会更好,但这并没有改变某些列是
字节
的事实。顺便说一句,您实际上不需要在这里执行
fetchall
。您可以对cur:中的行进行迭代
,光标应该一次给您一行,在内存中缓冲它认为最有效的行,而不是将它们全部读入内存。另外,不关闭为编写而打开的文件通常是个坏主意,可以使用
close()
调用,也可以使用
with
语句。