0

这是我在这里的第一篇文章,所以我不希望这不是错误的主题或其他内容,但我在编写的 Python 应用程序中遇到了一个有点不寻常的问题。

基本上,我要做的是从文本文件中读取并将其中的一部分插入到 Tkinter 文本小部件中。文本文件包含通常的“\n”换行符,但是当我运行代码时,我得到了这个奇怪的错误,我无法为以下问题制定解决方法:

(顺便说一句,很抱歉这里的设置很糟糕......不确定如何使用这个新的代码输入系统;它似乎“按自己的规则玩”并且有自己的语法,所以我只是在下面复制/粘贴它:

    Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\idlelib\run.py", line 107, in main
    seq, request = rpc.request_queue.get(block=True, timeout=0.05)
  File "C:\Python33\lib\queue.py", line 175, in get
    raise Empty
queue.Empty

在处理上述异常的过程中,又出现了一个异常:

Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1442, in __call__
    return self.func(*args)
  File "C:\Users\Owner\Desktop\Python projects\The Ultimate Joke Book.py", line 89, in search
    results.create()
  File "C:\Users\Owner\Desktop\Python projects\The Ultimate Joke Book.py", line 31, in create
    joke = linecache.getline('Jokes/jokelist.txt',x)
  File "C:\Python33\lib\linecache.py", line 15, in getline
    lines = getlines(filename, module_globals)
  File "C:\Python33\lib\linecache.py", line 41, in getlines
    return updatecache(filename, module_globals)
  File "C:\Python33\lib\linecache.py", line 127, in updatecache
    lines = fp.readlines()
  File "C:\Python33\lib\codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 627: invalid start byte

所以导致问题的函数——只是一个for循环中使用的“linecache.getline”——当文本中没有“\”时完美运行,但无论出于何种原因它不喜欢“\”并开始吐口水的错误。:/

所以今晚我在“文档”(http://docs.python.org/3/howto/unicode.html)上花了将近一个小时,阅读了 unicode 的所有历史和基本概念,但它加载了假设知识,虽然它在纯概念层面上提供信息和帮助,但在实际信息和潜在解决方案方面似乎并没有多大作用。

我能想出解决这个烦人的小错误的唯一解决方案是改用“/n”,并以编程方式将字符串拆分为一个数组(或在 Python 中调用的“列表”),然后使用循环将其分解为多于 1 行......但这听起来像是很多不必要的步骤,特别是如果已经存在一个常见的解决方法。因此,我将不胜感激有关如何解决这个特别神秘的问题的任何见解。

谢谢。

4

1 回答 1

0

UTF-8解码器给出的数据不是UTF-8。这就是你得到错误的原因。您需要向我们提供失败的代码和一些数据示例来准确解释正在发生的事情。

有问题的字符是 Latin-1 和 CP-1252 中的“¿”。也许这是在 Windows 机器上编写的西班牙语文本?在这种情况下,请在打开文件时指定编码。

于 2013-05-21T04:54:36.270 回答