我正在尝试使用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。这些将转换为确实在文件中2099位置的有效utf-8字符“ t”,“ o”,“(空格)”。
我该如何解决该错误,为什么它仅在UNIX计算机上出现?
编辑:运行
import sys
sys.getdefaultencoding()
'utf-8'
在两个系统上的returnb 。
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计算机上指定的编码。但是,继续尝试使用我指定的两种编码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句