带有 readlines() 方法的 Python3 UnicodeDecodeError

新手上路,请多包涵

尝试创建一个 Twitter 机器人来读取行并发布它们。通过我的共享服务器空间上的 virtualenv 使用 Python3 和 tweepy。这是代码中似乎有问题的部分:

 #!/foo/env/bin/python3

import re
import tweepy, time, sys

argfile = str(sys.argv[1])

filename=open(argfile, 'r')
f=filename.readlines()
filename.close()

这是我得到的错误:

 UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 0: ordinal not in range(128)

该错误特别指向 f=filename.readlines() 作为错误来源。知道可能出什么问题了吗?谢谢。

原文由 r_e_cur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 631
1 个回答

我认为最好的答案(在 Python 3 中)是使用 errors= 参数:

 with open('evil_unicode.txt', 'r', errors='replace') as f:
    lines = f.readlines()

证明:

 >>> s = b'\xe5abc\nline2\nline3'
>>> with open('evil_unicode.txt','wb') as f:
...     f.write(s)
...
16
>>> with open('evil_unicode.txt', 'r') as f:
...     lines = f.readlines()
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 0: invalid continuation byte
>>> with open('evil_unicode.txt', 'r', errors='replace') as f:
...     lines = f.readlines()
...
>>> lines
['�abc\n', 'line2\n', 'line3']
>>>

请注意, errors= 可以是 replaceignore 。这是 ignore 的样子:

 >>> with open('evil_unicode.txt', 'r', errors='ignore') as f:
...     lines = f.readlines()
...
>>> lines
['abc\n', 'line2\n', 'line3']

原文由 caleb 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题