2010-04-15 13 views
16

Voglio scrivere file di testo con terminazioni di linea DOS/Windows '\ r \ n' usando python in esecuzione su Linux. Mi sembra che ci sia un modo migliore di mettere manualmente un \ r \ n alla fine di ogni riga o usare una linea che termina l'utilità di conversione. Idealmente mi piacerebbe essere in grado di fare qualcosa come assegnare a os.linesep il separatore che voglio usare durante la scrittura del file. O specificare il separatore di riga quando apro il file.Uso di python per scrivere file di testo con terminazioni di linea DOS su linux

+0

A giudicare dalle numerose risposte "potresti scrivere ...", non esiste alcuna funzione "os.lineEnding" in Python. Devi scrivere qualcosa da te, sembra, nel qual caso la tua idea di scegliere "\ r \ n" o "\ n" è un buon metodo come qualsiasi. Per scrivere un file, sembra che questo sia l'unico modo. – Demis

risposta

3

Basta scrivere un file-like che avvolge un altro file-like e che converte \n-\r\n sulla scrittura.

Ad esempio:

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

sembra essere la migliore risposta per python 2.5 e precedenti – gaumann

+1

Esempio per favore? –

+2

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

2

si può guardare questo PEP per qualche riferimento.

Aggiornamento:

@OP, si può provare a creare qualcosa di simile

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

"Non esiste un supporto speciale per l'output su file con una nuova convenzione di nuova riga, quindi anche la modalità" wU "è illegale." –

+0

Quel PEP riguarda la lettura dei file tutto quello che dice sull'output è "Non esiste un supporto speciale per l'output su file con una nuova convenzione newline" – gaumann

+0

ho pensato che fosse sufficiente scrivere solo un formato, ad esempio "\ n" su linux e quindi utilizzare la modalità "U" su Windows e riconoscerà? se no, il mio male per interpretare male il PEP. – ghostdog74

63

Per Python 2.6 e versioni successive, la funzione open nel modulo io ha un parametro di ritorno a capo opzionale che consente di specificare quali nuove righe che si desidera utilizzare.

Ad esempio:

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

creerà un file che contiene questo:

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

Puoi accettare questa (tua) risposta al posto di quella attualmente accettata? Va bene lasciare l'altro in giro per quelli bloccati su 2.5 o inferiore, ma penso che questa sia la risposta migliore per la maggior parte delle persone. –

+3

In python3 puoi usare il comando di apertura 'open' con il parametro' newline' – johnson

0

Si potrebbe scrivere una funzione che converte il testo allora lo scrive. Per esempio:

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

Ecco uno script python che ho scritto. Ricorre da una determinata directory, sostituendo tutte le terminazioni di riga \ n con \ r \ n finali. Usalo in questo modo:

unix2windows /path/to/some/directory 

Ignora i file nelle cartelle che iniziano con un '.'. Ignora anche i file che pensa siano file binari, utilizzando l'approccio dato da J.F. Sebastian in this answer. È possibile filtrare ulteriormente utilizzando l'argomento posizionale regex facoltativo:

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

Ecco lo script per intero. A scanso di equivoci, le mie parti sono autorizzate con il numero 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)) 
Problemi correlati