从CSV编写/读取特殊字符(Python 3.6)

Pac*_*men 3 python csv unicode decode utf-8

让我们假设我需要编写然后在Python 3.6中的.csv中读取带有波兰语的字符串列表:

lista=['szcz??liwy','jab?ko','s?o?','kot']
Run Code Online (Sandbox Code Playgroud)

由于无法在.csv中编写Unicode字符,因此我将字符串编码为utf-8,因此数据在文件中保存(在第一个.csv单元格内):

b'szcz\xc4\x99\xc5\x9bliwy',b'jab\xc5\x82ko',b's\xc5\x82o\xc5\x84',b'kot'
Run Code Online (Sandbox Code Playgroud)

但是我无法使用以下代码解码output.csv文件中的数据:

with open('output.csv') as csvarchive:
    entrada = csv.reader(csvarchive)
    for reg in entrada:
        lista2=reg

print(lista2)
["b'szcz\\xc4\\x99\\xc5\\x9bliwy'", "b'jab\\xc5\\x82ko'", "b's\\xc5\\x82o\\xc5\\x84'", "b'kot'"]
Run Code Online (Sandbox Code Playgroud)

lista2 仍然是一个字符串列表,但使用utf-8编码,我无法恢复特殊字符.

我尝试了几种方法,比如在'rb'模式下读取文件,再次编码和解码......但是因为我是新手,所以我没有成功.它必须有非常简单的解决方案.

Tom*_*lak 10

  1. 切勿在未指定编码的情况下打开文本文件(这通常是正确的).
  2. 始终打开CSV文件newline=''(这适用于Python csv模块)

因此,假设您的CSV文件是UTF-8编码的,请使用:

with open('output.csv', 'r', encoding='UTF-8', newline='') as csvarchive:
    entrada = csv.reader(csvarchive)
    for reg in entrada:
        # do something with the data row, it's already decoded
Run Code Online (Sandbox Code Playgroud)

这同样适用于编写文件:

with open('output.csv', 'w', encoding='UTF-8', newline='') as csvarchive:
    writer = csv.writer(csvarchive)
    # write data to the writer, it will be encoded automatically
Run Code Online (Sandbox Code Playgroud)

无需进行任何手动字符串编码.将字符串值csv写入writer,文件编码将透明地发生.