用Python替换空白字符串中的奇怪单引号(')

时间:2011-09-13 01:13:36

标签: python

我正在尝试使用string.replace('’','')来替换可怕的奇怪的单引号字符:'(又名\ xe2又名#8217)。但是当我运行那行代码时,我收到了这个错误:

SyntaxError: Non-ASCII character '\xe2' in file

编辑:尝试替换远程获取的CSV文件中的字符时出现此错误。

# encoding: utf-8

import urllib2

# read raw CSV data from URL
url = urllib2.urlopen('http://www.aaphoenix.org/meetings/aa_meetings.csv')
raw = url.read()

# replace bad characters
raw = raw.replace('’', "")

print(raw)

即使执行了上述代码,打印结果中仍然存在不需要的字符。我也尝试了以下答案中的建议。很确定这是一个编码问题,但我只是不知道如何解决它,所以当然任何帮助都非常感激。

5 个答案:

答案 0 :(得分:12)

此处的问题是您下载的文件的编码 aa_meetings.csv)。服务器不在其HTTP标头中声明编码,但文件中唯一的非ASCII 1 八位字节的值为0x92。你说这应该是“可怕的奇怪的单引号字符”,因此文件的编码是windows-1252。但是你正在尝试搜索和替换U + 2019的UTF-8编码,即'\xe2\x80\x99',这不是文件中的内容。

解决此问题非常简单,只需向encodedecode添加适当的调用即可:

# encoding: utf-8
import urllib2

# read raw CSV data from URL
url = urllib2.urlopen('http://www.aaphoenix.org/meetings/aa_meetings.csv')
raw = url.read().decode('windows-1252')

# replace bad characters
raw = raw.replace(u'’', u"'")

print(raw.encode("ascii"))

1 by“ASCII”我指的是“将单个八位字节值0x00到0x7F直接映射到U + 0000到U + 007F的字符编码,并没有用值定义八位字节的含义0x80到0xFF“。

答案 1 :(得分:8)

您必须declare the encoding源文件。 把它作为代码的前两行之一:

# encoding: utf-8

如果您使用的是UTF-8以外的编码(例如Latin-1),则必须改为使用。

答案 2 :(得分:3)

此文件在Windows-1252中编码。撇号U+2019在此编码中编码为\x92。正确的做法是将文件解码为Unicode以进行处理:

data = open('aa_meetings.csv').read()
assert '\x92' in data
chars = data.decode('cp1252')
assert u'\u2019' in chars
fixed = chars.replace(u'\u2019', '')
assert u'\u2019' not in fixed

问题是您正在搜索UTF-8编码的U+2019,即\xe2\x80\x99,它不在文件中。转换为Unicode解决了这个问题。

我在这里使用unicode文字是一种避免这种错误的简单方法。但是,如果您将字符编写为u'’'

,则可以直接对该字符进行编码
Python 2.7.1
>>> u'’'
u'\u2019'
>>> '’'
'\xe2\x80\x99'

答案 3 :(得分:2)

您可以string.replace('\xe2', "'")使用正常的单引号替换它们。

答案 4 :(得分:0)

尽管替换了单引号,但我的Python脚本反复出现了Non-ASCII character '\xe2'错误。结果是非ASCII字符确实是双重短划线( - )。我用常规双短划线( - )替换它并修复它。 [两者在大多数屏幕上看起来都一样。根据您的字体设置,有问题的字体可能会显得更长一些。]

对于在Python脚本中遇到相同问题的任何人(在他们的代码行中,而不是在脚本加载的数据中):

选项1:摆脱有问题的角色

  • 手动重新输入线条。 (以确保您没有错误地复制粘贴有问题的字符。)
  • 请注意,注释掉该行不起作用。
  • 检查有问题的角色是否真的是您想到的角色。

选项2:更改编码

在脚本的开头声明一个编码,正如Roberto所指出的那样:

# encoding: utf-8

希望这有助于某人。