我无法理解如何检测 csv 文件的正确编码。我创建了一个小的 csv 文件作为样本,用于测试、剪切和粘贴我要处理的原始文件之一中的一些行,并将该信息作为 CSV 保存在我的本地 excel 中。我的程序可以毫无问题地处理此文件或类似文件,但是当我尝试打开从另一台计算机发送给我的文件时,程序退出并出现错误。
打开文件的代码部分:
with open(file_path,'r') as f:
dialect = csv.Sniffer().sniff(f.read(1024))
f.seek(0)
reader = csv.DictReader(f, fieldnames=['RUT', 'Nombre', 'Telefono'], dialect=dialect)
for row in reader:
numeros.append(row['Telefono'])
错误:
Traceback (most recent call last):
File "C:/Users/.PyCharmEdu3.5/config/scratches/scratch.py", line 22, in <module>
for row in reader:
File "C:\Program Files\Python35\lib\csv.py", line 110, in __next__
row = next(self.reader)
File "C:\Program Files\Python35\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 6392: character maps to <undefined>
Process finished with exit code 1
我的 locale.getpreferredencoding() 是 'cp1252'
我做了几次尝试来猜测编码:
with open(file_path,'r', encoding='cp1252') as f:
它适用于我本地生成的 csv,但不适用于我发送的那些。
with open(file_path,'r', encoding='utf-8') as f:
不适用于任何文件,但会产生不同的错误:
Traceback (most recent call last):
File "C:/Users/.PyCharmEdu3.5/config/scratches/scratch.py", line 19, in <module>
dialect = csv.Sniffer().sniff(f.read(1024))
File "C:\Program Files\Python35\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd1 in position 1670: invalid continuation byte
Process finished with exit code 1
我也尝试添加newline=''
到 open() 但它没有任何区别。
根据stackoverflow的回答,我用记事本打开了文件,并在“另存为”中检查了编码,我的本地文件和我从电子邮件收到的文件都显示“ANSI”作为编码。
我是否需要自己弄清楚编码,或者python可以为我做到这一点?我的代码有问题吗?
我使用的是 Python 3.5,这些文件最有可能是在具有西班牙操作系统的计算机中创建的。
更新:我一直在做更多的测试。几乎所有 csv 文件都可以正常打开,并且程序运行正常,但是当我尝试打开它们时,有 2 个文件会导致错误。如果我使用 excel 或记事本,这些文件看起来很正常。我怀疑这些文件是在使用不常见的操作系统或语言的计算机上创建或保存的。