[Tutor] Conflict with encoding in console view and file dump

Peter Otten __peter__ at web.de
Tue Aug 3 18:29:33 CEST 2010


Alex Baraibar wrote:

> Hi, Peter.
> Sorry for the delay, I've been out for a while.
> So I did what you suggested and it prints the following:
> 
> "
> import sys
> print >> sys.stderr, sys.stdout.encoding
> 
> what does the above print
> (a) when you print to the console? it prints cp850
> (b) when you redirect to a file? it prints None

That's as expected. 

You should normally get an exception like

Traceback (most recent call last):
  File "tmp_enc.py", line 33, in <module>
    print element
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 
11: ordinal not in range(128)

when you redirect your script's output to a file.

Did you change the default encoding? If you didn't you probably have an ill-
behaved application on your system that did it without asking.
 
> Any suggestions?

Check stdout.encoding, and if it is None (unknown encoding) wrap the stdout 
stream into a Writer. Your script with that modification:

# -*- coding: cp1252 -*-

def festivos():
    fest = [ 'Any Nou:\t\t\t1 de enero',
             'Reis:\t\t\t\t6 de enero',
             'Festa del Treball:\t\t1 de mayo',
             'Sant Joan:\t\t\t24 de junio',
             u'La Assumpció:\t\t\t15 de agosto',
             'La Diada:\t\t\t11 de septiembre',
             u'La Mercè:\t\t\t24 de septiembre',
             'La Hispanitat:\t\t\t12 de octubre',
             'Tots Sants:\t\t\t1 de novembre',
             u'La Constitució:\t\t\t6 de desembre',
             u'La Concepció:\t\t\t8 de desembre',
             'Nadal:\t\t\t\t25 de desembre',
             'Sant Esteve:\t\t\t26 de desembre' ]
    return fest

def separador( num, char ):
    return char * num

# --- Main ---
import sys
if sys.stdout.encoding is None:
    import codecs
    Writer = codecs.getwriter("latin-1")
    sys.stdout = Writer(sys.stdout)

dias = festivos()
print "Los festivos fijos anuales son:\n"
for element in dias:
    sep = separador( 50, '-' ) # move that out of the loop
    print element
    print sep

Peter



More information about the Tutor mailing list