Uso de Python para escribir archivos de texto con finales de línea DOS en Linux

Quiero escribir archivos de texto con los finales de línea DOS / Windows ‘\ r \ n’ usando Python que se ejecuta en Linux. Me parece que debe haber una mejor manera que poner manualmente un ‘\ r \ n’ al final de cada línea o usar una utilidad de conversión de final de línea. Idealmente, me gustaría poder hacer algo como asignar a os.linesep el separador que deseo usar al escribir el archivo. O especifique el separador de línea cuando abra el archivo.

Simplemente escriba un archivo similar a un archivo que se ajuste a otro tipo de archivo y que convierta \n en \r\n en escritura.

Por ejemplo:

 class ForcedCrLfFile(file): def write(self, s): super(ForcedCrLfFile, self).write(s.replace(r'\n', '\r\n')) 

Para Python 2.6 y versiones posteriores, la función de abrir en el módulo io tiene un parámetro de nueva línea opcional que le permite especificar qué nuevas líneas desea utilizar.

Por ejemplo:

 import io with io.open('tmpfile', 'w', newline='\r\n') as f: f.write(u'foo\nbar\nbaz\n') 

creará un archivo que contiene esto:

 foo\r\n bar\r\n baz\r\n 

Puedes ver este PEP para alguna referencia.

Actualizar:

@OP, puedes intentar crear algo como esto

 import sys plat={"win32":"\r\n", 'linux':"\n" } # add macos as well platform=sys.platform ... o.write( line + plat[platform] ) 

Aquí hay un script en python que escribí. Se repite desde un directorio dado, reemplazando todas las \ n finales de línea con \ r \ n terminaciones. Úsalo así:

 unix2windows /path/to/some/directory 

Ignora los archivos en carpetas que comienzan con ‘.’. También ignora los archivos que cree que son archivos binarios, utilizando el enfoque dado por JF Sebastian en esta respuesta . Puede filtrar más usando el argumento posicional de expresiones regulares opcional:

 unix2windows /path/to/some/directory .py$ 

Aquí está el guión completo. Para evitar dudas, mis piezas están autorizadas bajo la licencia MIT .

 #!/usr/bin/python import sys import os import re from os.path import join textchars = bytearray({7,8,9,10,12,13,27} | set(range(0x20, 0x100)) - {0x7f}) def is_binary_string(bytes): return bool(bytes.translate(None, textchars)) def is_binary_file(path): with open(path, 'rb') as f: return is_binary_string(f.read(1024)) def convert_file(path): if not is_binary_file(path): with open(path, 'r') as f: text = f.read() print path with open(path, 'wb') as f: f.write(text.replace('\r', '').replace('\n', '\r\n')) def convert_dir(root_path, pattern): for root, dirs, files in os.walk(root_path): for filename in files: if pattern.search(filename): path = join(root, filename) convert_file(path) # Don't walk hidden dirs for dir in list(dirs): if dir[0] == '.': dirs.remove(dir) args = sys.argv if len(args) <= 1 or len(args) > 3: print "This tool recursively converts files from Unix line endings to" print "Windows line endings" print "" print "USAGE: unix2windows.py PATH [REGEX]" print "Path: The directory to begin recursively searching from" print "Regex (optional): Only files matching this regex will be modified" print "" else: root_path = sys.argv[1] if len(args) == 3: pattern = sys.argv[2] else: pattern = r"." convert_dir(root_path, re.compile(pattern)) 

Podrías escribir una función que convierte texto y luego escribirla. Por ejemplo:

 def DOSwrite(f, text): t2 = text.replace('\n', '\r\n') f.write(t2) #example f = open('/path/to/file') DOSwrite(f, "line 1\nline 2") f.close()