(Python 3) Cómo pasar un archivo binario como texto sin guardar primero

O, quizás, un título mejor: cómo evitar el retorno de carro adicional no deseado cuando se pasa una cláusula de escritura de archivo binario a modo texto.

Python 3.6, Windows. El archivo de entrada debe someterse primero a una búsqueda / reemplazo binario, y luego a una búsqueda / reemplazo regex.

Primero abro el archivo de entrada en modo binario, hago el trabajo y lo guardo en modo binario en un archivo temporal. Luego lo abro en modo de texto, hago la búsqueda / reemplazo de expresiones regulares y lo guardo en modo de texto (con un nombre parecido al del archivo de entrada).

def fixbin(infile): with open(infile, 'rb') as f: file = f.read() # a few bytearray operations here, then: with open('bin.tmp', 'wb') as f: f.write(file) def fix4801(fname, ext): outfile = '{}_OK{}'.format(fname, ext) with open('bin.tmp', encoding='utf-8-sig', mode='r') as f, \ open(outfile, encoding='utf-8-sig', mode='w') as g: infile = f.read() x = re.sub(r'(\n4801.+\n)4801', r'\1 ', infile) g.write(y) infile, fname, ext = get_infile() # function get_infile not shown for brevity fixbin(infile) fix4801(fname, ext) 

Funciona pero es feo. Prefiero pasar salidas como archivos, así:

 def fixbin(infile): with open(infile, 'rb') as f: file = f.read() # a few bytearray operations here, and then return file.decode('utf-8') def fix4801(infile): x = re.sub(r'(\n4801.+\n)4801', r'\1 ', infile) return x ... temp = fixbin(infile) result = fix4801(temp) outfile = '{}_OK{}'.format(fname, ext) with open(outfile, encoding='utf-8-sig', mode='w') as g: g.write(result) 

Pero luego el archivo de salida (Windows) obtiene un retorno de carro adicional no deseado. Los síntomas se describen aquí , pero la causa es diferente: no estoy usando os.linesep , en otras palabras, no hay os.linesep en mi código. (Puede haber en las bibliotecas subyacentes, no he comprobado.)

¿Qué estoy haciendo mal?

Python »Documentación : abierta

 open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None) 

Valor predeterminado : newline=None . Si la nueva línea es '' o '\n' , no se realiza ninguna traducción.
Intenta lo siguiente si hace algo diferente:

 #change open(outfile, encoding='utf-8-sig', mode='w') as g: #with open(outfile, encoding='utf-8-sig', mode='w', newline='') as g: 

Pregunta : … no hay os.linesep en mi código.


Python »Documentación : abierta
Cuando se escribe la salida en el flujo, si la nueva línea es Ninguna, todos los caracteres ‘\ n’ escritos se convierten al separador de línea predeterminado del sistema, os.linesep Si newline es ” o ‘\ n’, no se realiza ninguna traducción. Si nueva línea es cualquiera de los otros valores legales, cualquier carácter ‘\ n’ escrito se traduce a la cadena dada.