python - 仅在 UNIX 系统上读取文件时出现 UnicodeDecodeError

标签 python python-3.x

我正在尝试使用 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/

相关文章:

javascript - 将 JavaScript 转换为 Python 代码时出现十六进制问题

python - 将相同的元素追加到python中的多个子列表中

python - GAE : Making many queries into one

django - PyCharm + Python 3.6 + Django + 调试 + 生成器 == 痛苦的世界

python - 如何使 PyQt 中的 QWidget 内容可滚动?

python - 如何处理大量目录和元素字符串?

Python 3 导入错误 : cannot import name 'model selection' OS X 10. 11.3, python

python - 有没有办法制作多人骰子游戏,让玩家轮流掷骰子并计算分数?

python - 在具有 OpenMP 依赖项的 Mac 上安装 Lightgbm

python - python 将具有相同键值对的多个字典合并为一个字典