我正在尝试解析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')])]
因此,显然发生的是§
字符被解析为§
。
发生这种情况是否有原因?我该如何解决呢?
答案 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')
仅给出... '§'
。
会发生什么:
该文件是utf-8编码的,您将其读取为latin1。只需声明编码即可:
with open(pathAndFileName, encoding='utf8', newline='') as csvFile:
您的Python环境将Unicode数据输出为UTF-8,而终端将其处理为Latin1。确保Python和终端使用相同的编码。很抱歉,我不做更多阐述,但这实际上取决于太多的东西,操作系统,终端,环境变量等。