2010-04-15 11 views
16

Quiero escribir archivos de texto con terminaciones de línea de DOS/Windows '\ r \ n' usando python ejecutándose en Linux. Me parece que debe haber una manera mejor 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 quiero usar al escribir el archivo. O especifica el separador de línea cuando abro el archivo.Uso de python para escribir archivos de texto con terminaciones de línea de DOS en Linux

+0

A juzgar por las numerosas respuestas "usted podría escribir ...", no hay ninguna característica 'os.lineEnding' en Python. Tienes que escribir algo tú mismo, parece, en cuyo caso tu idea de elegir "\ r \ n" o "\ n" es un método tan bueno como cualquier otro. Para escribir un archivo, parece que esta es la única forma. – Demis

Respuesta

3

Sólo tiene que escribir un archivo similar que envuelve otro archivo similar y que convierte \n-\r\n en la escritura.

Por ejemplo:

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

parece ser la mejor respuesta para python 2.5 y anteriores – gaumann

+1

Ejemplo por favor? –

+2

'def write (self, s):' 'parent.write (self, s.replace (r '\ n', '\ r \ n'))' –

2

Puede consultar este PEP para obtener una referencia.

Actualización:

@OP, puede 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]) 
+0

"No hay soporte especial para que la salida se archive con una convención de nueva línea diferente, y entonces el modo" wU "también es ilegal." –

+0

Ese PEP se trata de leer archivos, todo lo que dice sobre la salida es: "No hay soporte especial para la salida a archivo con una convención de nueva línea diferente" – gaumann

+0

pensé que solo necesitas escribir un formato, por ejemplo, "\ n" en Linux y luego usa el modo "U" en Windows y lo reconocerá? si no, es malo por malinterpretar el PEP. – ghostdog74

63

Para Python 2.6 y versiones posteriores, la función open en el módulo io tiene un parámetro de salto de línea opcional que le permite especificar los saltos de línea que 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 lo siguiente:

foo\r\n 
bar\r\n 
baz\r\n 
+6

¿Puede aceptar esta (su) respuesta en lugar de la respuesta actualmente aceptada? Está bien dejar el otro para aquellos atascados en 2.5 o menos, pero creo que esta es la respuesta mucho mejor para la mayoría de las personas. –

+3

En python3 puedes usar el 'abrir' integrado con el parámetro' newline' – johnson

0

Se podría escribir una función que convierte el texto lo escribe. 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() 
1

Aquí hay un script de python que escribí. Recurre desde un directorio dado, reemplazando todas las terminaciones de línea \ n con terminaciones \ r \ n. Úselo así:

unix2windows /path/to/some/directory 

Ignora los archivos en las carpetas que comienzan con un '.'. También ignora los archivos que cree que son archivos binarios, utilizando el enfoque dado por J.F. Sebastian en this answer. Puede filtrar aún más utilizando el argumento posicional regex opcional:

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

Aquí tiene el guión completo. Para evitar dudas, mis piezas tienen licencia bajo the MIT licence.

#!/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)) 
Cuestiones relacionadas