UnicodeEncodeError:"ascii"编解码器无法在第34个位置编码字符u'\u201c':这个数字不在128的范围内。

40

我一直在开发一个从Stack Overflow检索问题的程序。直到昨天,这个程序都能正常运行,但是从今天开始,我遇到了以下错误:

"Message    File Name   Line    Position    
Traceback               
<module>    C:\Users\DPT\Desktop\questions.py   13      
UnicodeEncodeError: 'ascii' codec can't encode character u'\u201c' in position 34: ordinal not in range(128)"

目前,问题已经显示出来了,但是我似乎无法将输出复制到一个新的文本文件中。

import sys
sys.path.append('.')
import stackexchange
so = stackexchange.Site(stackexchange.StackOverflow)
term= raw_input("Enter the keyword for Stack Exchange")
print 'Searching for %s...' % term,
sys.stdout.flush()
qs = so.search(intitle=term)
print '\r--- questions with "%s" in title ---' % (term)
for q in qs:
  print '%8d %s' % (q.id, q.title)
  with open('E:\questi.txt', 'a+') as question:
     question.write(q.title)

 time.sleep(10)
 with open('E:\questi.txt') as intxt:
   data = intxt.read()

regular = re.findall('[aA-zZ]+', data)
print(regular)

tokens = set(regular)

with open('D:\Dictionary.txt', 'r') as keywords:
  keyset = set(keywords.read().split())


with open('D:\Questionmatches.txt', 'w') as matches:
  for word in keyset:
    if word in tokens:
        matches.write(word + '\n')

哪一行导致了这个错误?另外,正则表达式[aA-zZ]+不会像你想的那样工作。你需要使用[A-Za-z]+或者(?i)[A-Z]+ - Tim Pietzcker
1
question.write(q.title) 导致了错误。 - Aaron Misquith
我正在使用 [aA-zZ]+ 提取单词并忽略数字和特殊字符。 - Aaron Misquith
我能看出你想做什么,但这个正则表达式并不是这样的。例如,它也匹配 `[]^_``... - Tim Pietzcker
2个回答

66

q.title是一个Unicode字符串。在写入文件时,您需要首先对其进行编码,最好使用完全支持Unicode的编码,例如UTF-8(否则,Python将默认使用ASCII编解码器,该编解码器不支持任何字符代码点超过127)。

question.write(q.title.encode("utf-8"))

需要解决这个问题。

顺便提一句,程序在字符U+201C)处出现了故障。


3

我在使用Transifex API时也遇到了这个问题

response['source_string']

UnicodeEncodeError: 'ascii'编解码器无法将字符u'\u2019'编码为位置3处的字符:超出范围(128)

通过response['source_string'].encode("utf-8")进行修复

import requests

username = "api"
password = "PASSWORD"

AUTH = (username, password)

url = 'https://www.transifex.com/api/2/project/project-site/resource/name-of-resource/translation/en/strings/?details'

response = requests.get(url, auth=AUTH).json()

print response['key'], response['context']
print response['source_string'].encode("utf-8")

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