UnicodeEncodeError: кодек 'ascii' не может кодировать символ u'“' в позиции 34: порядковый номер не в диапазоне (128)

Я работаю над программой для извлечения вопросов из переполнения стека. До вчерашнего дня программа работала нормально, а с сегодняшнего дня выдает ошибку

"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')

person Aaron Misquith    schedule 17.06.2014    source источник
comment
Какая строка вызывает эту ошибку? Кроме того, регулярное выражение [aA-zZ]+ не будет делать то, что вы думаете. Вам нужно [A-Za-z]+ или (?i)[A-Z]+.   -  person Tim Pietzcker    schedule 17.06.2014
comment
question.write(q.title) вызывает ошибку.   -  person Aaron Misquith    schedule 17.06.2014
comment
Я использую [aA-zZ]+ для извлечения только слов и игнорирую числа и специальные символы.   -  person Aaron Misquith    schedule 17.06.2014
comment
Я вижу, что вы пытаетесь сделать это, но это не то, что делает это регулярное выражение. Например, он также соответствует [\]^_`...   -  person Tim Pietzcker    schedule 17.06.2014


Ответы (2)


q.title — это строка Юникода. При записи этого в файл вам необходимо сначала закодировать его, предпочтительно полностью совместимую с Unicode кодировку, такую ​​​​как UTF-8 (если вы этого не сделаете, Python по умолчанию будет использовать кодек ASCII, который не поддерживает кодовую точку символа выше 127) .

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

должен решить проблему.

Кстати, программа споткнулась на символе (U+201C).

person Tim Pietzcker    schedule 17.06.2014

Я также столкнулся с этим, используя API Transifex.

response['source_string']

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 3: ordinal not in range(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")
person Vinnie James    schedule 18.08.2017