我遇到了与python(IPython notebook)中的编码问题有关的问题。由于这类问题非常普遍和简单,但我仍然无法解决它。
我这里有一个CSV文件,你可以看到我们在这个文件中有很多'\ xa0'和其他'\ n'字符。
我用过
with io.open(train_fname) as f:
for line in f:
line = line.encode("ascii", "replace")
但它不起作用,我总是得到以下输出。
想象一下,能够说出来,你知道什么,没有制裁,没有永久听取IEAA的规定,不再隐藏\ xa0under \ xa0借助友好的核能。 \ xa0你有2天的时间; \ xa0i.e。在检察官办公室里,不要杀害平民。
我尝试过其他方法,比如
line.replace(u"\xa0", " ")
它也没有用,我也尝试了各种编码在我的文本编辑,崇高文本中打开这个CSV文件。
我尝试了windows-1252,utf-8和所有其他编码,但在查看此CSV文件时,我总是得到\ xa0是我的文本编辑。
这是否意味着
\ XA0
已经在此CSV文件中写为输入文本?这不是python编码的问题吗?如果是这种情况,为什么我不能使用replace方法来简单地替换这个字符串? \ xa0表示文件编码在哪?编码?这意味着这个文件是用utf-8编写的,但我试图用ascii或其他情况打开它?
我搜索了很多问题,但似乎没有提供太多帮助。如果我的问题不是很清楚,请问我。 非常感谢你!
`
答案 0 :(得分:6)
您看到的\xa0
是一个包含4个字符的序列:\
x
a
0
。所有这些字符都是纯ASCII,因此这里没有字符集问题。
显然,你应该解释这些转义序列。你用空格替换它们的想法是好的,但你必须小心反斜杠字符。当它出现在字符串文字中时,必须写入\\
。所以试试这个:
line.replace("\\xa0", " ")
或:
line.replace(r"\xa0", " ")
字符串前面的r
意味着按字面解释每个字符,甚至是反斜杠。
请注意,CSV文件中的数据充满了不一致。例子:
\n
可能意味着换行。\\n
也会出现,也可能意味着换行。\xa0
是一个不间断的空间,以ISO-8859-1编码。\xc2\xa0
是一个不间断的空间,以UTF-8编码。\\xc2\\xa0
也出现,意思相同。\\\\n
也会出现。因此,为了从该文件中获取有意义的内容,您应该重复解释转义序列,直到没有任何变化。之后,尝试将生成的字节序列解释为UTF-8。如果它工作,很好。如果没有,请将其解释为代码页1252(这是ISO-8859-1的超集)。
答案 1 :(得分:3)
\xa0
代表的字符为U+00A0: NO-BREAK SPACE。
但是,您的字符串不包含字符"\xa0"
;它包括文字文本 \xa0
(即Python字符串"\\xa0"
),以及许多其他编码字符。 (在文本编辑器中打开文件,您将看到我的意思。)您可以使用string_escape
编码将这些转换为它们代表的字符:
for line in f:
line = line.decode("string_escape")
…