2016-11-05 288 views
4

我试图运行以下命令:如何用Anaconda(Python 3)中的Spyder解决这个编码问题?

import json 
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt' 
records = [json.loads(line) for line in open(path)] 

,但我得到了以下错误:

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

从我发现,它应该是互联网,因为编码需要设置到utf-8,但我的问题是它已经在utf-8中。

sys.getdefaultencoding() 
Out[43]: 'utf-8' 

此外,它看起来像我的文件是UTF-8,所以我真的很困惑 此外,下面的代码工作:

In [15]: path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt' 
In [16]: open(path).readline() 

有没有办法解决这个问题的方法吗?

谢谢!

编辑:

当我跑在我的控制台它工作的代码,而不是当我在Anaconda安装提供Spyder的运行(https://www.continuum.io/downloads

你知道什么可以去错了?

+1

您是否尝试过使用编码实际打开文件? –

+0

你是什么意思? open(path).readline()效果不错 – Krowar

+0

您必须已经将该文件错误地下载了确定您是否将它下载为 - 不是通过文本编辑器或其他东西复制粘贴的?您的代码在我的系统上运行时没有出现错误,只是从您提供的位置下载完全相同的文件。我在Windows 7和Linux上都尝试过Python 3.5.1。 –

回答

2

该文本文件在某处包含一些非ascii字符。不知怎的,你的设置默认文件编码设置为ASCII而非UTF-8,请执行下列操作,并明确指定文件的编码:

import json 
path = 'ch02/usagov_bitly_data2012-03-16-1331923249.txt' 
records = [json.loads(line.strip()) for line in open(path, encoding="utf-8"))] 

(这样做是一个好主意,反正即使在默认工程)

+0

谢谢,它使它工作! 但我仍然不明白如何在spyder中获得错误,而不是在普通终端中。 尤其是因为我的env变量PYTHONIOENCODING = UTF-8,并且在spyder和系统控制台中,我都有sys.getdefaultencoding()给我utf-8 – Krowar

+0

,因为PYTHONIOIOODNODING与文件I/O无关,它控制stdin/stdout/stderr https://docs.python.org/3/using/cmdline.html#envvar-PYTHONIOENCODING。提示:请阅读http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html –

0

我尝试用在最上面的一个附加线运行此程序:

# -*- coding: utf-8 -*- 

它获取的线和显示输出(带u”前缀字符串;可能会在此之后需要转换)。但是,它并没有像你提到的那样抛出任何错误。

+2

编码指令对脚本处理外部Unicode数据的方式具有_no_影响。它纯粹用于告诉Python解释器哪些编码已被用于脚本本身。 –