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

时间:2017-11-02 16:32:55

标签: python csv unicode utf-8 decode

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

lista=['szczęśliwy','jabłko','słoń','kot']

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

b'szcz\xc4\x99\xc5\x9bliwy',b'jab\xc5\x82ko',b's\xc5\x82o\xc5\x84',b'kot'

但是我无法使用以下代码解码 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'"]

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

我尝试了几种方法,例如以'rb'模式读取文件,再次进行编码和解码......但由于我是这些问题的新手,我没有做到。它必须有非常简单的解决方案。

1 个答案:

答案 0 :(得分:8)

  1. 永远不要在未指定编码的情况下打开文本文件(这通常是正确的)。
  2. 始终使用newline=''打开CSV文件(这适用于Python csv模块)
  3. 因此,假设您的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
    

    同样适用于编写文件:

    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
    

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