2010-11-06 59 views
9

Quiero guardar la salida (contents) en un archivo (guardándolo en UTF-8). El archivo no se debe sobrescribir, se debe guardar como un archivo nuevo, p. file2.txt Por lo tanto, puño abrir un file.txt, codificarlo en UTF-8, hacer algunas cosas y luego quiero guardarlo en file2.txt en UTF-8. ¿Cómo hago esto?Escribiendo en un archivo .txt (UTF-8), python

import codecs 
def openfile(filename): 
    with codecs.open(filename, encoding="UTF-8") as F: 
     contents = F.read() 
     ... 
+0

"El archivo no debe sobrescribirse". ¿Por qué solo hay uno abierto si está leyendo un archivo y está escribiendo un nuevo archivo? –

+0

porque este es un código inacabado. ... – Gusto

+0

"porque este es un código inacabado"? ¿Qué? "sin terminar" no es una buena explicación para la falta de coincidencia entre sus requisitos y su código. ¿Por qué solo hay uno abierto? Por favor, corrija su código para que coincida con sus requisitos un poco mejor. –

Respuesta

16

El camino corto:

file('file2.txt','w').write(file('file.txt').read().encode('utf-8')) 

El largo camino:

data = file('file.txt').read() 
... process data ... 
data = data.encode('utf-8') 
file('file2.txt','w').write(data) 

Y el uso de 'codecs' explícitamente:

codecs.getwriter('utf-8')(file('/tmp/bla3','w')).write(data) 
+0

el archivo 'archivo2.txt' cuando se abre en el bloc de notas no está codificado para utf-8, probablemente porque decodifiqué los datos usando códecs (códecs de importación) y cuando lo guardo en un archivo lo uso de una manera diferente a la sugerida (usando codificación método). La pregunta es ¿cómo la codifico usando códecs? – Gusto

+0

@Gusto - Agregué un método separado, aunque es completamente equivalente. ¿Cómo se puede ver en el bloc de notas que un archivo no está codificado para utf-8? el bloc de notas realmente hace la decodificación para usted. – adamk

+0

Puedo verlo porque los caracteres cirílicos no se muestran correctamente, tengo que decodificarlo manualmente usando el codificador de bloc de notas. P.S. Usando Notepad ++ – Gusto

9

Me gusta separar las preocupaciones en situaciones como esta: creo que realmente hace que el código sea más limpio, más fácil de mantener y puede ser más eficiente.

Aquí tiene 3 inquietudes: leer un archivo UTF-8, procesar las líneas y escribir un archivo UTF-8. Suponiendo que su procesamiento se basa en líneas, esto funciona perfectamente en Python, ya que la apertura e iteración sobre las líneas de un archivo está integrada en el idioma. Además de ser más claro, esto también es más eficiente, ya que le permite procesar archivos enormes que no caben en la memoria. Finalmente, le ofrece una excelente manera de probar su código, ya que el procesamiento está separado del archivo, le permite escribir pruebas unitarias o incluso simplemente ejecutar el código de procesamiento en texto de ejemplo y revisar manualmente el resultado sin manipular los archivos.

Estoy convirtiendo las líneas en mayúsculas a modo de ejemplo, presumiblemente su procesamiento será más interesante. Me gusta usar el rendimiento aquí: facilita el procesamiento para eliminar o insertar líneas adicionales, aunque eso no se está utilizando en mi ejemplo trivial.

def process(lines): 
    for line in lines: 
     yield line.upper() 

with codecs.open(file1, 'r', 'utf-8') as infile: 
    with codecs.open(file2, 'w', 'utf-8') as outfile: 
     for line in process(infile): 
      outfile.write(line) 
Cuestiones relacionadas