web-dev-qa-db-fra.com

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

J'ai ce code:

    printinfo = title + "\t" + old_vendor_id + "\t" + Apple_id + '\n'
    # Write file
    f.write (printinfo + '\n')

Mais je reçois cette erreur en l'exécutant:

    f.write(printinfo + '\n')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 7: ordinal not in range(128)

C'est avoir toruble écrit ceci:

Identité secrète (Abduction) [VF]

Toutes les idées s'il vous plaît, pas sûr de savoir comment réparer.

À votre santé.

UPDATE: Ceci est la majeure partie de mon code, vous pouvez donc voir ce que je fais:

def runLookupEdit(self, event):
    newpath1 = pathindir + "/"
    errorFileOut = newpath1 + "REPORT.csv"
    f = open(errorFileOut, 'w')

global old_vendor_id

for old_vendor_id in vendorIdsIn.splitlines():
    writeErrorFile = 0
    from lxml import etree
    parser = etree.XMLParser(remove_blank_text=True) # makes pretty print work

    path1 = os.path.join(pathindir, old_vendor_id)
    path2 = path1 + ".itmsp"
    path3 = os.path.join(path2, 'metadata.xml')

    # Open and parse the xml file
    cantFindError = 0
    try:
        with open(path3): pass
    except IOError:
        cantFindError = 1
        errorMessage = old_vendor_id
        self.Error(errorMessage)
        break
    tree = etree.parse(path3, parser)
    root = tree.getroot()

    for element in tree.xpath('//video/title'):
        title = element.text
        while '\n' in title:
            title= title.replace('\n', ' ')
        while '\t' in title:
            title = title.replace('\t', ' ')
        while '  ' in title:
            title = title.replace('  ', ' ')
        title = title.strip()
        element.text = title
    print title

#########################################
######## REMOVE UNWANTED TAGS ########
#########################################

    # Remove the comment tags
    comments = tree.xpath('//comment()')
    q = 1
    for c in comments:
        p = c.getparent()
        if q == 3:
            Apple_id = c.text
        p.remove(c)
        q = q+1

    Apple_id = Apple_id.split(':',1)[1]
    Apple_id = Apple_id.strip()
    printinfo = title + "\t" + old_vendor_id + "\t" + Apple_id

    # Write file
    # f.write (printinfo + '\n')
    f.write(printinfo.encode('utf8') + '\n')
f.close()
37
speedyrazor

Vous devez encoder explicitement Unicode avant d'écrire dans un fichier, sinon Python le fait pour vous avec le codec par défaut ASCII.

Choisissez un encodage et respectez-le:

f.write(printinfo.encode('utf8') + '\n')

ou utilisez io.open() pour créer un objet fichier qui encodera pour vous pendant que vous écrivez dans le fichier:

import io

f = io.open(filename, 'w', encoding='utf8')

Vous voudrez peut-être lire:

avant de continuer.

68
Martijn Pieters