Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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
为什么pythons的s.encode(';ascii';,';替换';)编码失败_Python_Python 2.7_Encode - Fatal编程技术网

为什么pythons的s.encode(';ascii';,';替换';)编码失败

为什么pythons的s.encode(';ascii';,';替换';)编码失败,python,python-2.7,encode,Python,Python 2.7,Encode,为什么在这里使用替换: s = s.encode('ascii', 'replace') 告诉我这个错误 UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 6755: ordinal not in range(128) 当无法解码一个字节时,“替换”或“忽略”的关键不在于不失败。我不明白这一点吗? (很抱歉,我无法提供实际字符串,语料库非常大) 在任何情况下,我如何告诉python忽略或替换非ascii字

为什么在这里使用替换:

s = s.encode('ascii', 'replace')
告诉我这个错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0xcb in position 6755: ordinal not in range(128)
当无法解码一个字节时,“替换”或“忽略”的关键不在于不失败。我不明白这一点吗?

(很抱歉,我无法提供实际字符串,语料库非常大)


在任何情况下,我如何告诉python忽略或替换非ascii字符?

请注意,您得到的是UnicodeCodeError,而不是UnicodeCodeError

这是因为
s.encode()
接受一个unicode字符串作为输入,但在本例中,您没有给它一个;你给它一个bytestring

因此,它对您在尝试解码之前将其交给unicode的bytestring进行编码,并在初始编码中发生错误


这种三方往返很愚蠢,但如果你真的想这样做:

s_bytes = '\xcb' # standard Python 2 string, aka a Python 3 bytestring
s_unicode = s_bytes.decode('ascii', 'replace') # a unicode string now
s_ascii = s_unicode.encode('ascii', 'replace') # a bytestring again

您不需要提供实际的字符串,只需要提供一个重现相同问题的字符串<例如,代码>'\xcb',就很好。但是,请注意,在Python2.x中,这是一个ASCII字符串,而不是Unicode字符串,这与您的问题非常相关。也就是说,
replace
ignore
用于UnicodeEncodeError处理,而不是UnicodeDecodeError处理。当你从一个unicode字符串开始创建一个ASCII字符串时会用到它们。所以如果我用替换选项将字符串编码为ASCII,我可能无法将该字符串安全地解码为ASCII?根据定义,这难道不意味着encode函数没有创建ascii字符串吗?“因此,如果我使用replace选项将字符串编码为ascii,我可能无法将该字符串安全地解码为ascii?”--嗯?我没说这类话……我想再清楚一点重申一下:问题是,如果您使用bytestring而不是unicode字符串调用
encode()
,它会尝试将其解码为unicode(以获得unicode字符串,然后按照您的要求将其编码回ASCII),但使用的设置不是您想要的设置。因此,如果您真的想通过unicode对ByTestString进行转码,您应该自己编写代码来处理这两个方向。我给它一个文本文件的内容作为输入(这是一个字符串)。一个Python 2字符串,对吗?还有什么python3称之为bytestring?那么这个答案正是关键所在。@anthonybell:检查
类型
。它将是
str
,即:字节字符串,而不是unicode字符串。ByTestRing可以转换为unicode(使用
decode
);unicode字符串可以转换为ByTestRing(使用
encode
)<编码>编码
更改内存中字符的内部表示形式?因此,如果我的字符串(一个字节字符串)应该只有ascii字符,我必须将其编码为ascii并从ascii解码回来,以得到一个只有ascii支持的字符的普通python字符串。“必须”有点强——还有其他可用的方法(见鬼,你可以过滤掉任何不在可打印集的字符),但是如果您想使用编码/解码功能(用于在unicode之间进行转换),是的,这就是您的方法。