我在理解如何检测csv文件的正确编码方面遇到了问题。 我创建了一个小的csv文件作为样本,用于测试,剪切和粘贴我想要处理的原始文件中的一些行,并将这些信息保存在我的本地Excel中,作为CSV。 我的程序可以毫无问题地处理这个或类似的文件,但是当我尝试打开从另一台计算机发送给我的文件时,程序退出并出现错误。
打开文件的代码部分:
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文件都打开没有问题,并且程序运行正常,但有两个文件在我尝试打开它们时会导致错误。如果我使用excel或记事本,这个文件看起来很正常。我怀疑这些文件是在具有不常见操作系统或语言的计算机上创建或保存的。