¿Imprimir en un archivo codificado en UTF-8, con nuevas líneas dependientes de la plataforma?

En Python, ¿cuál es la mejor manera de escribir en un archivo codificado en UTF-8 con nuevas líneas dependientes de la plataforma? Lo ideal sería que la solución funcionara de manera bastante transparente en un progtwig que imprima mucho en Python 2. (¡La información sobre Python 3 también es bienvenida!)

De hecho, la forma estándar de escribir en un archivo UTF-8 parece ser codecs.open (‘name.txt’, ‘w’) . Sin embargo, la documentación indica que

(…) no se realiza conversión automática de ‘\ n’ en lectura y escritura.

porque el archivo está realmente abierto en modo binario. Entonces, ¿cómo escribir en un archivo UTF-8 con las nuevas líneas adecuadas que dependen de la plataforma?

Nota: el modo ‘t’ parece hacer el trabajo (codecs.open (‘name.txt’, ‘wt’)) con Python 2.6 en Windows XP, pero ¿está documentado y está garantizado que funcione?

Suponiendo Python 2.7.1 (esos son los documentos que citó): el modo ‘wt’ no está documentado (el ÚNICO modo documentado es ‘r’), y no funciona: el módulo de códecs agrega ‘b’ al modo, lo que hace que falle:

>>> f = codecs.open('bar.txt', 'wt', encoding='utf8') Traceback (most recent call last): File "", line 1, in  File "C:\python27\lib\codecs.py", line 881, in open file = __builtin__.open(filename, mode, buffering) ValueError: Invalid mode ('wtb') 

Evita el módulo codecs y el bricolaje:

 f = open('bar.text', 'w') f.write(unicode_object.encode('utf8')) 

Actualización sobre Python 3.x:

Parece que el codecs.open () tiene la misma deficiencia (no escribirá el terminador de línea específico de la plataforma). Sin embargo, el open () incorporado, que tiene un argumento de encoding , está feliz de hacerlo:

 [Python 3.2 on Windows 7 Pro] >>> import codecs >>> f = codecs.open('bar.txt', 'w', encoding='utf8') >>> f.write('line1\nline2\n') >>> f.close() >>> open('bar.txt', 'rb').read() b'line1\nline2\n' >>> f = open('bar.txt', 'w', encoding='utf8') >>> f.write('line1\nline2\n') 12 >>> f.close() >>> open('bar.txt', 'rb').read() b'line1\r\nline2\r\n' >>> 

Actualización sobre Python 2.6

Los documentos dicen lo mismo que los 2.7 documentos. La diferencia es que el truco “bludgeon into binary mode” de la adición de “b” al modo arg falló en 2.6 porque “wtb” no se detectó como un modo no válido, el archivo se abrió en modo texto y parece funcionar Como quisieras, no como documentado:

 >>> import codecs >>> f = codecs.open('fubar.txt', 'wt', encoding='utf8') >>> f.write(u'\u0a0aline1\n\xffline2\n') >>> f.close() >>> open('fubar.txt', 'rb').read() '\xe0\xa8\x8aline1\r\n\xc3\xbfline2\r\n' # "works" >>> f.mode 'wtb' # oops >>> 

En Python 2, ¿por qué no codificar explícitamente?

 with open('myfile.txt', 'w') as f: print >> f, some_unicode_text.encode('UTF-8') 

Tanto las nuevas líneas incrustadas como las emitidas por print se convertirán a la nueva línea de plataforma adecuada.