Codec 'ascii' cannot decode 0xef byte at position

I get this annoying error on this line:

r += '\n<Placemark><name>'+row[3].encode('utf-8','xmlcharrefreplace')+'</name>' \ '\n<description>'+desc.encode('utf-8','xmlcharrefreplace')+'</description>\n' \ '<Point><coordinates>'+row[clat].encode('utf-8','xmlcharrefreplace')+ ','+row[clongitude].encode('utf-8','xmlcharrefreplace')+'</coordinates></Point>\n' \ '<address>'+row[4].encode('utf-8','xmlcharrefreplace')+'</address>\n' \ '<styleUrl>'+row[cstyleID].encode('utf-8','xmlcharrefreplace')+'</styleUrl>\n' \ '</Placemark>' 

here is the error:

 Traceback (most recent call last): File "<pyshell#38>", line 1, in <module> doStuff() File "C:\Python27\work\GenerateKML.py", line 5, in doStuff createFiles('together.csv') File "C:\Python27\work\GenerateKML.py", line 55, in createFiles '<styleUrl>'+row[cstyleID].encode('utf-8','xmlcharrefreplace')+'</styleUrl>\n' \ UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 60: ordinal not in range(128) 

What am I doing wrong?

Thank you for your help.

here is the full source:

 import hashlib import csv def doStuff(): createFiles('together.csv') def readFile(fileName): a=open(fileName) fileContents=a.read() a.close() return fileContents def readCSVFile(fileName): return list(csv.reader(open(fileName, 'rb'), delimiter=',', quotechar='"')) def GetDistinctValues(theFile, theColumn): with open(theFile, "rb") as fp: reader = csv.reader(fp) return list(set(line[theColumn] for line in reader)) def createFiles(inputFile): cNAME=3 clat=0 clongitude=1 caddress1=4 caddress2=5 cplace=6 ccity=7 cstate=8 czip=9 cphone=10 cwebsite=11 cstyleID=18 inputFileText=readCSVFile(inputFile) headerFile = readFile('header.txt') footerFile = readFile('footer.txt') r=headerFile DISTINCTCOLUMN=12 dValues = GetDistinctValues(inputFile,DISTINCTCOLUMN) counter=0 for uniqueValue in dValues: counter+=1 print uniqueValue theHash=hashlib.sha224(uniqueValue).hexdigest() for row in inputFileText: if uniqueValue==row[DISTINCTCOLUMN]: for eachElement in row: eachElement=eachElement.replace('&','&amp;') desc = ' '.join(row[3:]) r += '\n<Placemark><name>'+row[3].encode('utf-8','xmlcharrefreplace')+'</name>' \ '\n<description>'+desc.encode('utf-8','xmlcharrefreplace')+'</description>\n' \ '<Point><coordinates>'+row[clat].encode('utf-8','xmlcharrefreplace')+ ','+row[clongitude].encode('utf-8','xmlcharrefreplace')+'</coordinates></Point>\n' \ '<address>'+row[4].encode('utf-8','xmlcharrefreplace')+'</address>\n' \ '<styleUrl>'+row[cstyleID].encode('utf-8','xmlcharrefreplace')+'</styleUrl>\n' \ '</Placemark>' r += footerFile f = open(theHash+'.kml','w') f.write(r) f.close() r=headerFile 
+4
source share
1 answer

Perhaps you are trying to encode bytes. In this case, Python first decodes the bytes using the default encoding (ASCII), and then continues to encode the result of the Unicode string using the encoding you provided.

Solution: do not encode bytes, i.e. use encode() only on Unicode strings. In your case, do not use it at all.

To create a valid XML document, you can use the xml.etree.ElementTree module .

+5
source

All Articles