Presuming Python 2.7.1 (that's the docs that you quoted): The 'wt' mode is not documented (the ONLY mode documented is 'r'), and does not work -- the codecs module appends 'b' to the mode, which causes it to fail:
>>> f = codecs.open('bar.txt', 'wt', encoding='utf8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:python27libcodecs.py", line 881, in open
file = __builtin__.open(filename, mode, buffering)
ValueError: Invalid mode ('wtb')
Avoid the codecs module and DIY:
f = open('bar.text', 'w')
f.write(unicode_object.encode('utf8'))
Update about Python 3.x:
It appears the codecs.open() has the same deficiency (won't write platform-specific line terminator). However built-in open(), which has an encoding
arg, is happy to do it:
[Python 3.2 on Windows 7 Pro]
>>> import codecs
>>> f = codecs.open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1
line2
')
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1
line2
'
>>> f = open('bar.txt', 'w', encoding='utf8')
>>> f.write('line1
line2
')
12
>>> f.close()
>>> open('bar.txt', 'rb').read()
b'line1
line2
'
>>>
Update about Python 2.6
The docs say the same as the 2.7 docs. The difference is that the "bludgeon into binary mode" hack of appending "b" to the mode arg failed in 2.6 because "wtb" wasn't detected as as an invalid mode, the file was opened in text mode, and appears to work as you wanted, not as documented:
>>> import codecs
>>> f = codecs.open('fubar.txt', 'wt', encoding='utf8')
>>> f.write(u'u0a0aline1
xffline2
')
>>> f.close()
>>> open('fubar.txt', 'rb').read()
'xe0xa8x8aline1
xc3xbfline2
' # "works"
>>> f.mode
'wtb' # oops
>>>
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…