Python错误“Ordinal not in range”带有重音符号

时间:2012-04-25 19:08:15

标签: python

我从互联网上抓取一张桌子并保存为CSV文件。文本中有带法语口音的字符,导致保存时出现unicode错误:

 UnicodeEncodeError: 'ascii' codec can't encode characters in position 5-6: ordinal not in range(128)

我想找到一个优雅的解决方案来保存重音字符,我可以应用于任何情况。我有时会使用以下内容:

 encode('ascii','ignore')

但由于未知原因,这次不起作用。我还试图替换单元格中的<sup>标记,因此我首先使用str()对其进行转换。

这是我的代码的相关部分:

 data = [
      str(td[0]).split('<sup')[0].split('>')[1].split('<')[0],
      td[1].getText()
 ]
 output.append(data)

 csv_file = csv.writer(open('savedFile.csv', 'w'), delimiter=',')

 for line in output:
      csv_file.writerow(line)

2 个答案:

答案 0 :(得分:0)

如果td[0]u"a<sup>b</sup>c"

td[0].split('<sup')u"a"

td[0].partition('>')[2].split('<')[0]u"b"

td[0][td[0].rindex('>') + 1:]u"c"

如果这种字符串索引和匹配过于简单,您可以考虑创建一个正则表达式并将其与html标记中的文本进行匹配:

import re
r = re.compile("[^<]*<sup>([^<]*)</sup>")
m = r.match("some<sup>text</sup>")
print(m.groups()[0])

答案 1 :(得分:0)

csv.reader()csv.writer()要求以二进制模式打开文件。您还应该在最后关闭该文件。因此,你应该写它:

f = open('output.csv', 'wb')
writer = csv.writer(f, delimiter=',')

for row in output:
    writer.writerow(row)

f.close()

或者,在使用较新版本的Python时,您可以使用with构造:

with open('output.csv', 'wb') as f:
    writer = csv.writer(f, delimiter=',')

    for row in output:
        writer.writerow(row)

...文件将自动关闭。

无论如何,csv.writer()期望由字节序列(而不是Unicode字符串)组成的行。如果您有Unicode字符串,请使用.encode('utf-8')转换它们:

    for row in output:
        encoded_row = [s.encode('utf-8') for s in row]
        writer.writerow(encoded_row)