不确定发生了什么。我有几个 python 程序,其中一些将 csv 文件数据更改为 kml 文件,其他一些删除 csv 文件中的多个数据条目,等等,昨天神秘地开始出现异常行为。
我使用的是 Linux Mint 17.3,它是在出现类似情况后的 1-1.5 周内重新安装的。之前我确实有其他几个原因需要重新格式化和重新安装 Linux。这一次没有其他原因,但这个问题又出现了,所以我现在无能为力。
第一次发生在昨天下午,只更改了一个程序中的文件名,代码中的其他任何内容都没有更改。它从工作正常开始,昨天下午的这个时候到晚上我收到一个错误代码,现在不记得实际的错误代码是什么,但我知道这很奇怪。
今天早上,当我回去处理这个庞大项目的不同部分时,我突然开始使用 csv 文件并将其转换为在 kml 文件上放置地标。这次我得到了错误代码:
utf-8 编解码器无法解码位置 0 中的字节 0xff:起始字节无效
我完全被难住了,但很快就会变得更糟。
在与它战斗了 10-15 分钟后,我决定将它放在一边,等到我有机会上网时再使用。相反,我继续尝试合并多个 csv 文件并删除多个条目。当我打开第一个 csv 文件时,它出现了 Libre Office 开始屏幕,并在屏幕上显示中文/日文/韩文/无论它们是什么,而不是我应该看到的简单英语。如果我将 csv 文件更改为 txt 文件,它就会正常显示并正常显示。原来任何超过 10Kb 的文件我都有这个问题。小型 csv 文件可以正常打开,但任何大小的文件都无法正确打开/根本无法打开。
我不太确定到底发生了什么,但这是过去两周内第二次发生这种情况。什么是以及如何消除这个问题?我什至不确定在哪里发布这个问题,因为它会影响很多不同的事情。
是的,我尝试打开的文件在昨天这个时候打开的很好,我尝试使用的程序也运行良好。
最佳答案
看起来您的文件已使用 utf-16
编码保存,但您正在尝试读取它们,就像它们被编码为 utf-8
一样。
字节0xff0xfe
是little-endian utf-16
byte order mark ,或 BOM
,一些文本文件开头的字节,它告诉程序文件是如何编码的。
>>> s = u'abc'
>>> s16 = s.encode('utf-16')
>>> s16
b'\xff\xfea\x00b\x00c\x00'
>>> s16.decode('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
因此您可以尝试通过读取文件、解码然后重新保存来恢复数据:
>>> with open('s16.txt', 'rb') as f:
... encoded = f.read()
... with open('new-file.txt', 'w') as outfile:
... outfile.write(encoded.decode('utf-16'))
...
3
>>> with open('new-file.txt') as f:
... f.read()
...
'abc'
我建议保存为不同的文件名,或者在执行此操作之前备份损坏的文件,这样如果它不起作用,您可以恢复到当前状态。
如果此方法修复了您的数据,您将面临导致损坏的原因的问题。可能某些应用程序或进程正在(重新)将这些文件写为 utf-16
:也许检查上次修改时间以查看您是否可以将更改与您采取的任何特定操作或 cron 任务相匹配.或者正如@MattDMo 建议的那样,也许您的语言环境设置在某个时候搞砸了。
关于python - utf8 错误代码,也就是奇怪地变成了亚洲符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41513173/