Python - 使用 utf-8 编码读取和写入 csv 文件

Posted

技术标签:

【中文标题】Python - 使用 utf-8 编码读取和写入 csv 文件【英文标题】:Python - Reading and writing csv files with utf-8 encoding 【发布时间】:2018-06-13 14:18:55 【问题描述】:

我正在尝试读取一个 csv 文件,它的标题包含外来字符,我遇到了很多问题。

首先,我用一个简单的 csv.reader 读取文件

filename = 'C:\\Users\\yuval\\Desktop\\בית ספר\\עבודג\\new\\resources\\mk'+ str(mkNum) + 'Data.csv'
raw_data = open(filename, 'rt', encoding="utf8")
reader = csv.reader(raw_data, delimiter=',', quoting=csv.QUOTE_NONE)
x = list(reader)
header = x[0]
data = np.array(x[1:]).astype('float')

var header应该是一个包含文件头的数组,但是它返回给我的数组是

['\ufeff"dayPart"', '"length"', '"ifPhoto"', '"ifVideo"', '"ifAlbum"', '"לא"', '"הוא"', '"בכל"', '"אותם"', '"זה"', '"הם"', '"כדי"', '"את"', '"יש"', '"לי"', '"היא"', '"אני"', '"רק"', '"להם"', '"על"', '"עם"', '"של"', '"המדינה"', '"כל"', '"גם"', '"הזה"', '"אם"', '"ישראל"', '"לכל"', '"מי"', '"ל"', '"אמסלם"', '"לנו"', '"אבל"', '"זו"', '"אין"', '"שבת"', '"שלום"', '"כ"', '"שלנו"', '"היום"', '"ומבורך"', '"ח"', '"דודי"', '"ר"', '"הפנים"', '"מה"', '"כי"', '"ה"', '"אחד"', '"ולא"', '"יותר"']

我不知道为什么它会在第一个对象和双引号中添加 \ufeff。

之后,我需要写入另一个 csv 文件并在标题中使用外来字符。我试图这样做,但它把字符写成奇怪的符号。

with open('C:\\Users\\yuval\\Desktop\\בית ספר\\עבודג\\new\\variance reduction 1\\mk'+ str(mkNum) + 'Data.csv', 'w', newline='', encoding='utf8') as csvFile:
    csvWriter = csv.writer(csvFile, delimiter=',')
    csvWriter.writerow(newHeader)

有谁知道如何解决这个问题并在 csv 文件的标头中使用 utf8 编码?

【问题讨论】:

你用的是哪个版本的python? utf-8 应该是 python 3 的默认值 \ufeff 是一个Byte Order Mark,通常可以在 Windows UTF-8 文件中找到,它可能会混淆csv。尝试使用utf-8-sig 进行编码。 @Bricky 它必须是 Python 3,因为 Python 2 不能返回 '\ufeff'u-less 字符串中 U+FF 之外的字符)。但是,我质疑您声称 utf-8 是“Python 3 的默认值”的说法:对于打开文件,默认编码取决于语言环境。 source code 的默认编码是 UTF-8,但这与当前问题无关。 【参考方案1】:

您报告了三个不同的问题。 这有点猜测,因为没有足够的信息可以确定,但您应该尝试以下方法:

    输入编码:按照 cmets 中的建议,尝试“utf-8-sig”。这将从您的输入中删除 Byte Order Mark (BOM)。

    双引号:在csv参数中,指定quoting=csv.QUOTE_NONE。这告诉csv 库,CSV 表是在不使用引号的情况下编写的(用于转义字符,否则可能会被误认为是字段或行分隔符)。然而,这显然不是真的,因为输入的 引号围绕每个字段。请改用csv.QUOTE_MINIMAL(默认)或csv.QUOTE_ALL

    输出编码:您说输出包含“奇怪的符号”。我怀疑输出实际上没问题,但是您使用的工具默认情况下无法正确显示 UTF-8 文本:许多 Windows 应用程序(例如 Excel)仍然更喜欢 UTF-16 和本地化的 8 位编码,例如 @987654322 @。与问题 1 一样,您应该尝试编解码器“utf-8-sig”:BOM 被许多查看者/编辑者理解为编码提示。

【讨论】:

谢谢。我不知道如何删除 BOM,而且我从未听说过“utf-8-sig”编码!

以上是关于Python - 使用 utf-8 编码读取和写入 csv 文件的主要内容,如果未能解决你的问题,请参考以下文章

中文乱码——编码问题

python读取和写入csv文件

Unicode (UTF-8) 在 Python 中读取和写入文件

在 C++11 中读取/写入/打印 UTF-8

Python文件读取和数据处理

关于Python文档读取UTF-8编码文件问题