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
risposta
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'))
sembra essere la migliore risposta per python 2.5 e precedenti – gaumann
Esempio per favore? –
'def write (self, s):' 'parent.write (self, s.replace (r '\ n', '\ r \ n'))' –
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])
"Non esiste un supporto speciale per l'output su file con una nuova convenzione di nuova riga, quindi anche la modalità" wU "è illegale." –
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
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
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
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. –
In python3 puoi usare il comando di apertura 'open' con il parametro' newline' – johnson
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()
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))
- 1. terminazioni di linea in pitone
- 2. Conversione di terminazioni di linea UNIX Mercurial su Windows
- 3. Perforce ha cambiato le terminazioni di linea
- 4. Git core.safecrlf comportamento diverso su file con le stesse terminazioni di linea
- 5. Come posso modificare le terminazioni di linea utilizzate da fputcsv?
- 6. Python aiuta a leggere il file csv in errore a causa di terminazioni di linea
- 7. Visual studio "terminazioni di linea incoerenti"
- 8. Come assicurarsi che tutti i miei file sorgente rimangano UTF-8 con terminazioni di linea Unix?
- 9. Come risolvere terminazioni di linea incoerenti per l'intera soluzione VS?
- 10. Ottieni $ webclient.downloadstring per scrivere su file di testo in PowerShell
- 11. Bash - esecuzione senza problemi di script con terminazioni di linea CRLF
- 12. confrontare due file di testo linea per linea
- 13. creare un file di testo e scrivere su di esso
- 14. Come rendere vim: source accetta differenti terminazioni di riga?
- 15. Flipping delle terminazioni di linea in C++ (o R)
- 16. Scrivere un dizionario in un file di testo in python
- 17. Come sostituire le terminazioni di linea in VIM
- 18. Come configurare GNU Emacs per scrivere file formattati UNIX o DOS per impostazione predefinita?
- 19. tavolo analisi con BeautifulSoup e scrivere in file di testo
- 20. scrivi file in usb con python su linux
- 21. È possibile utilizzare il comando linux cat per scrivere il testo su file?
- 22. convertire le terminazioni di linea dos2unix per tutti i file in una directory
- 23. Analisi file di testo con Python
- 24. Uso di OpenGL con Python
- 25. DOS ciclo FOR sulla gamma attraverso la linea di comando
- 26. Equivalente DOS del comando "trova" di Unix?
- 27. Python: scrivere un elenco con caratteri non ASCII in un file di testo
- 28. Python: scrivere nella memoria di un altro processo sotto linux
- 29. Creazione di file eseguibili su Linux
- 30. Uso di echo senza spazio finale in DOS
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