Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python UnicodeDecodeError:&x27;ascii';编解码器可以';在位置2对字节0xd1进行t解码:序号不在范围内(128)_Python_Django_Utf 8 - Fatal编程技术网

Python UnicodeDecodeError:&x27;ascii';编解码器可以';在位置2对字节0xd1进行t解码:序号不在范围内(128)

Python UnicodeDecodeError:&x27;ascii';编解码器可以';在位置2对字节0xd1进行t解码:序号不在范围内(128),python,django,utf-8,Python,Django,Utf 8,我正在尝试处理一个非常大的数据集,其中包含一些非标准字符。根据工作规范,我需要使用unicode,但我感到困惑。(而且很可能全部做错了。) 我使用以下方式打开CSV: 15 ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"') 然后,我尝试用以下代码对其进行编码: name=school_name.encode('utf-8'), street=row[9].

我正在尝试处理一个非常大的数据集,其中包含一些非标准字符。根据工作规范,我需要使用unicode,但我感到困惑。(而且很可能全部做错了。)

我使用以下方式打开CSV:

 15     ncesReader = csv.reader(open('geocoded_output.csv', 'rb'), delimiter='\t', quotechar='"')
然后,我尝试用以下代码对其进行编码:

name=school_name.encode('utf-8'), street=row[9].encode('utf-8'), city=row[10].encode('utf-8'), state=row[11].encode('utf-8'), zip5=row[12], zip4=row[13],county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
除了lat和lng,我正在对所有内容进行编码,因为它们需要发送到API。当我运行程序将数据集解析为我可以使用的数据集时,我得到以下回溯

Traceback (most recent call last):
  File "push_into_db.py", line 80, in <module>
    main()
  File "push_into_db.py", line 74, in main
    district_map = buildDistrictSchoolMap()
  File "push_into_db.py", line 32, in buildDistrictSchoolMap
    county=row[25].encode('utf-8'), lat=row[22], lng=row[23])
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd1 in position 2: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“push_into_db.py”,第80行,in
main()
文件“push_into_db.py”,第74行,在main中
地区地图=buildDistrictSchoolMap()
buildDistrictSchoolMap中第32行的文件“push_into_db.py”
county=第[25]行。编码('utf-8'),lat=第[22]行,lng=第[23]行)
UnicodeDecodeError:“ascii”编解码器无法解码位置2:序号不在范围(128)中的字节0xd1
我想我应该告诉你,我正在使用Python2.7.2,这是django 1.4上构建的应用程序的一部分。我已经读了好几篇关于这个话题的文章,但似乎没有一篇是直接适用的。任何帮助都将不胜感激


您可能还想知道,导致此问题的一些非标准字符是ñ,可能是É。

Unicode不等于UTF-8。后者只是前者的编码

你做得不对。您正在读取UTF-8编码的数据,因此必须将UTF-8编码的字符串解码为unicode字符串

因此,只需将
.encode
替换为
.decode
,它就可以工作了(如果.csv是UTF-8编码的)

不过,没什么好羞愧的。我敢打赌,五分之三的程序员一开始很难理解这一点,如果不是更多的话;)

更新:
如果您的输入数据不是UTF-8编码的,那么您当然必须使用适当的编码
.decode()
。如果未给出任何内容,python将采用ASCII,这显然对非ASCII字符无效。

只需将以下行添加到代码中:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

该错误的主要原因是python假定的默认编码是ASCII。 因此,如果要通过
encode('utf8')
编码的字符串数据包含ASCII范围之外的字符,例如,对于类似“hgvcj”的字符串터파크387',python将抛出错误,因为字符串不是预期的编码格式

如果您使用的是早于3.5版的python版本,可靠的修复方法是将python假定的默认编码设置为
utf8

import sys
reload(sys)
sys.setdefaultencoding('utf8')
name = school_name.encode('utf8')
这样,python就能够预测字符串中超出ASCII范围的字符

但是,如果您使用的是python版本3.5或更高版本,则reload()函数不可用,因此您必须使用decode(例如)来修复它

name = school_name.decode('utf8').encode('utf8')

适用于Python3用户。你能行

with open(csv_name_here, 'r', encoding="utf-8") as f:
    #some codes
它也适用于flask:)

对于Python 3用户:

将编码从“ascii”更改为“latin1”是可行的

此外,您还可以尝试通过使用以下代码段读取前10000个字节来自动查找编码:

import chardet  
with open("dataset_path", 'rb') as rawdata:  
            result = chardet.detect(rawdata.read(10000))  
print(result)

由于lat和long的原因,使用UTF 16编码打开

with open(csv_name_here, 'r', encoding="utf-16") as f:

如果您在创建或续订证书时运行certbot时遇到此问题,请使用以下方法

grep-r-p'[^\x00-\x7f]'/etc/apache2/etc/letsencrypt/etc/nginx

该命令在注释中的一个.conf文件中发现了有问题的字符“')。在删除它(您可以根据需要编辑注释)并重新加载nginx之后,一切都恢复了正常


来源:

我的计算机设置了错误的区域设置

我是第一个这样做的

>>> import locale
>>> locale.getpreferredencoding(False)
'ANSI_X3.4-1968'
是由调用的函数。输出应该是
'UTF-8'
,但在本例中是一些

然后我运行bash命令并得到这个输出

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
因此,我使用的是默认的Ubuntu语言环境,这使得Python以ASCII而不是UTF-8打开文件。我必须
en_US.UTF-8

sudo apt install locales 
sudo locale-gen en_US en_US.UTF-8    
sudo dpkg-reconfigure locales
如果无法在系统范围内更改语言环境,则可以如下方式调用所有Python代码:

PYTHONIOENCODING="UTF-8" python3 ./path/to/your/script.py
或者

export PYTHONIOENCODING="UTF-8"

要在shell中设置它,请在中运行。

或者在Python中处理文本时,如果文本是Unicode文本,请注意它是Unicode

设置
text=u'unicode text'
,而只设置
text='unicode text'


这在我的例子中是有效的。

它的工作原理是只取参数'rb'read binary而不是'r'read

您的原始文件编码是什么?我认为您应该根据原始编码对其进行解码,然后将其转换为utf 8可能的重复[Ed.:我敢肯定还有大约无数其他版本。]错误的原因是Python试图自动将其从默认编码ASCII解码,以便它可以按照指定的方式将其编码为utf-8。因为数据不是有效的ASCII码,所以它不起作用。当然,但是如果它是UTF8编码的数据(我猜),那么
。decode('utf-8')
应该起作用,当然,你可能是对的。我刚才解释了为什么在这种情况下你会犯这样的错误。太好了!非常感谢你。原来是.decode('latin-1')——这很有意义,因为正是它给了我这个问题。再一次!非常感谢。您的解决方案适用于某些情况,但如果我使用此解决方案,则会出现另一个错误“ascii”编解码器无法对位置2中的字符u'\xf1'进行编码:序号不在范围(128)内。您的答案与我的答案之间的差异更详细。人们经常发现因果关系的细节很有用。顺便说一句,你的代码可以正常工作,没有贬损的意思。在Python3中,重载是可用的,你只需要导入它。从进口进口reload@Meow但是Python3中没有sys.setdefaultencoding。因此,在兼容性py2\py3的上下文中,可以进行一些检查,sys.getdefaultencoding()可能是。如果你能给我一点建议,我将不胜感激。这是我第一次在这里帮助别人。知道我帮了忙,感觉很好:)你也帮了我:)所有其他的答案对我都不起作用