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
Respuesta
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'))
parece ser la mejor respuesta para python 2.5 y anteriores – gaumann
Ejemplo por favor? –
'def write (self, s):' 'parent.write (self, s.replace (r '\ n', '\ r \ n'))' –
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])
"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." –
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
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
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
¿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. –
En python3 puedes usar el 'abrir' integrado con el parámetro' newline' – johnson
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()
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))
- 1. Leer dos archivos de texto línea por línea simultáneamente -python
- 2. Buscar y eliminar terminaciones de línea de DOS en Ubuntu
- 3. Detener Visual Studio al mezclar terminaciones de línea en archivos
- 4. ¿Cómo se buscan archivos que contengan dos finales de línea (CRLF) con grep en Linux?
- 5. Eliminar línea de texto de varios archivos en Linux
- 6. Procesamiento de texto con dos archivos
- 7. Normalización de terminaciones de línea en Ruby
- 8. Perforce modificó las terminaciones de línea
- 9. Uso de Hibernate para trabajar con archivos de texto
- 10. Análisis de archivos de texto con Python
- 11. Comparación de dos archivos de texto en python
- 12. bash, Linux: establecer la diferencia entre dos archivos de texto
- 13. Motor de consulta SQL para archivos de texto en Linux?
- 14. Cómo reemplazar terminaciones de línea en VIM
- 15. Combinar dos archivos de texto con powershell
- 16. comparar dos archivos de texto usando linq?
- 17. Obtener tiempo de creación de archivos con Python en linux
- 18. Editor de texto con secuencias de comandos ... para Linux
- 19. ¿La forma más rápida de escribir archivos hdf5 con Python?
- 20. ¿Cómo configurar GNU Emacs para escribir archivos con formato UNIX o DOS de forma predeterminada?
- 21. Lote normalizar terminaciones de línea en Visual Studio
- 22. ¿Cómo me aseguro de que todos mis archivos fuente permanezcan UTF-8 con terminaciones de línea Unix?
- 23. Comprobando los permisos de archivos en Linux con Python
- 24. ¿Cómo maneja git-svn las terminaciones de línea?
- 25. Formateo de Resharper está cambiando las terminaciones de línea
- 26. iOS - Uso de TTTAttributedLabel para establecer dos colores de texto
- 27. extrayendo texto de MS archivos de Word en python
- 28. escribir csv con dos líneas de encabezado?
- 29. Lectura de texto con formato utilizando Python
- 30. Conversión de terminaciones de línea Mercurial UNIX a Windows
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