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

6

我有一个与Python(IPython笔记本)编码问题相关的问题。由于这些问题非常普遍且简单,但我仍然无法真正解决它。

我在这里有一个CSV文件,您可以看到我们在此文件中有许多'\xa0'和其他'\n'字符。

我使用了

with io.open(train_fname) as f:
for line in f:
    line = line.encode("ascii", "replace")

但这并没有起作用,我总是得到以下输出。

想象一下,你能够说:你知道吗,不要制裁,也不要永远就IEAA法规进行听证,也不要再以友好的核能为借口而隐藏。你们有2天时间;即允许检查员进入,停止屠杀平民。

我尝试了其他方法,如:

line.replace(u"\xa0", " "),这也没有起作用,我还尝试了在文本编辑器、Sublime Text中打开此CSV文件的所有编码,如Windows-1252、UTF-8,但每次查看此CSV文件时都会得到\xa0。

这是否意味着\xa0已经被写入此CSV文件作为输入文本?这不是Python编码的问题吗?如果是这种情况,为什么我不能使用 replace 方法来简单地替换此字符串?\xa0表示该文件采用哪种编码方式进行编码?这意味着该文件是以UTF-8编写的,但我尝试以ASCII或其他情况打开它了吗?

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

`


1
replace() 方法不是原地操作。 - Ignacio Vazquez-Abrams
你的输入文件是什么编码? - John Carter
2个回答

14

你们看到的\xa0是由四个字符组成的序列:\xa0。所有这些字符都是普通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。如果可以,那就好。如果不行,则将其解释为Codepage 1252(它是ISO-8859-1的超集)。


我已经添加了关于CSV文件内容的一些注释,请享受其中 :) - Roland Illig
哦,最重要的是:不要默默地修复你收到的极度损坏的数据,而是向你从中获取数据的来源抱怨。他们必须提供格式正确的数据。既然他们甚至不能正确地获取数据格式,我也不会相信有效载荷是正确的。 - Roland Illig

3
\xa0代表的字符是U+00A0: NO-BREAK SPACE
但是,您的字符串中并不包含字符"\xa0";它包含了文字字面量\xa0(即Python字符串"\\xa0"),以及许多其他编码字符。 (在文本编辑器中打开文件,您就会明白我的意思。)您可以使用string_escape编码将它们转换为它们所代表的字符:
for line in f:
    line = line.decode("string_escape")
    …

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接