web-dev-qa-db-fra.com

UnicodeEncodeError: le codec 'ascii' ne peut pas coder le caractère u '\ u201c' en position 34: l'ordinal n'est pas dans la plage (128)

J'ai travaillé sur un programme pour récupérer des questions de débordement de pile. Jusqu'à hier, le programme fonctionnait bien, mais depuis aujourd'hui, j'ai l'erreur 

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

Actuellement, les questions sont affichées, mais il me semble impossible de copier le résultat dans un nouveau fichier texte.

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')
27
Aaron Misquith

q.title est une chaîne Unicode. Lorsque vous écrivez cela dans un fichier, vous devez d'abord l'encoder, de préférence un encodage entièrement compatible Unicode tel que UTF-8 (sinon, Python utilisera par défaut le codec ASCII qui ne prend en charge aucun point de code de caractère supérieur à 127). .

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

devrait résoudre le problème.

À propos, le programme a déclenché le caractère (U+201C).

50
Tim Pietzcker

J'ai aussi rencontré ceci avec Transifex API

response['source_string']

UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 3: ordinal not in range(128)

Fixé avec 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")
1
Vinnie James