我正在尝试使用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)
即使执行了上述代码,打印结果中仍然存在不需要的字符。我也尝试了以下答案中的建议。很确定这是一个编码问题,但我只是不知道如何解决它,所以当然任何帮助都非常感激。
答案 0 :(得分:12)
此处的问题是您下载的文件的编码 (aa_meetings.csv
)。服务器不在其HTTP标头中声明编码,但文件中唯一的非ASCII 1 八位字节的值为0x92。你说这应该是“可怕的奇怪的单引号字符”,因此文件的编码是windows-1252
。但是你正在尝试搜索和替换U + 2019的UTF-8编码,即'\xe2\x80\x99'
,这不是文件中的内容。
解决此问题非常简单,只需向encode
和decode
添加适当的调用即可:
# 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)
答案 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
希望这有助于某人。