Python CSV解析“§”字符

时间:2019-04-15 14:44:45

标签: python csv encoding

我正在尝试解析python中包含.csv字符的§文件,例如:

Name;Paragraph
Spam;§15

以及以下代码:

import csv
pathAndFileName = r"D:\Spam\test.csv"
with open(pathAndFileName, newline='') as csvFile:
    reader = csv.DictReader(csvFile, delimiter=';', quotechar='"')
    csvObject= []
    for row in reader:
        csvObject.append(row)
    print(csvObject)

但是,由于某种原因,它像这样被解析:

[OrderedDict([('Name', 'Spam'), ('Paragraph', '§15')])]

因此,显然发生的是§字符被解析为§

发生这种情况是否有原因?我该如何解决呢?

2 个答案:

答案 0 :(得分:2)

使用encoding='utf-8'

example2.csv:

Name;Paragraph
Spam;§15

因此

import csv
pathAndFileName = r"example2.csv"
with open(pathAndFileName, newline='', encoding='utf-8') as csvFile:
    reader = csv.DictReader(csvFile, delimiter=';', quotechar='"')
    csvObject= []
    for row in reader:
        csvObject.append(row)
    print(csvObject)

输出

[OrderedDict([('Name', 'Spam'), ('Paragraph', '§15')])]

答案 1 :(得分:2)

  

因此,显然发生的是§字符被解析为§

或多或少,但这与csv解析无关。这只是由于编码不一致引起的。

'§'是Unicode字符U + 00A7。在Latin1或Windows cp1252中,它编码为b'\xa7';在UTF-8中,它编码为b'\xc2\xa7'

b'\xc2\xa7'.decode('latin1')仅给出... '§'

会发生什么:

  1. 该文件是utf-8编码的,您将其读取为latin1。只需声明编码即可:

    with open(pathAndFileName, encoding='utf8', newline='') as csvFile:
    
  2. 您的Python环境将Unicode数据输出为UTF-8,而终端将其处理为Latin1。确保Python和终端使用相同的编码。很抱歉,我不做更多阐述,但这实际上取决于太多的东西,操作系统,终端,环境变量等。

相关问题