Python:在CSV中获得\ xa0而不是空格,无法删除或转换

时间:2016-05-29 18:58:32

标签: python csv encoding utf-8

我遇到了与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或其他情况打开它?

我搜索了很多问题,但似乎没有提供太多帮助。如果我的问题不是很清楚,请问我。 非常感谢你!

`

2 个答案:

答案 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")
    …