我正在尝试使用 python 3.7 读取(大)文本文件。我正在做的事情很简单:
with open(filename,'r') as f:
for il,l in enumerate(f,il):
%do things
如果我在 Windows 上从 Spyder 的 IPython 控制台运行脚本,则效果非常好。
但是,如果我运行完全相同的脚本从 unix 服务器读取完全相同的文件(不是副本!),我会收到以下错误:
File "/net/atgcls01/data2/j02660606/code/freeGSA.py", line 127, in read_gwa
for il,l in enumerate(f,il):
File "/u/lon/lamerio/.conda/envs/la3.7/lib/python3.7/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb0 in position 2099: invalid start byte
我试图找到罪魁祸首以了解发生了什么。我做了:
bytes = []
fobj = open(settings['GSA_file'],'rb')
for i in range(3000):
b = fobj.read(1)
bytes.append((i, b, b.hex()))
fobj.close()
bytes[2095:2105]
输出为
[(2095, b'0', '30'), (2096, b'0', '30'), (2097, b' ', '20'), (2098, b't', '74'), (2099, b'o', '6f'), (2100, b' ', '20'), (2101, b'5', '35'), (2102, b'6', '36'), (2103, b'1', '31'), (2104, b' ', '20')]
我在位置 2099 处没有看到任何 0xb0 字符。事实上,位置 2098 是 0x74,位置 2099 是 0x6f,位置 2100 是 0x20。这些转换为有效的 utf-8 字符“t”、“o”、“”(空格),这些字符确实位于文件中的位置 2099。
我怎样才能解决这个错误以及为什么它只出现在unix机器上?
编辑: 正在运行
import sys
sys.getdefaultencoding()
在两个系统上都返回 'utf-8'
。
PS:在 Windows 上我有版本 3.7.5,而在 unix 上我有 3.7.4。
最佳答案
在unix机器上,尝试
with open(filename,encoding='latin-1') as f: ...
或
with open(filename,encoding='windows-1252') as f: ...
编辑:Windows 的默认编码与 UNIX(通常)不同。我假设您在 Windows 计算机上编辑/创建了这些文件。您还可以打开这些文件之一,我相信使用记事本,它会在右下角显示编码。我可能是错的,因为我是凭内存记忆的。无论如何,这就是您要在 UNIX 计算机上指定的编码。但请继续尝试我指定的两种编码。
关于python - 仅在 UNIX 系统上读取文件时出现 UnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58913758/