2012-12-19 14 views
7

Ho trovato un elenco della maggior parte delle parole inglesi online, ma le interruzioni di riga sono di tipo unix (codificate in Unicode: UTF-8). L'ho trovato su questo sito: http://dreamsteep.com/projects/the-english-open-word-list.htmlCome si converte LF in CRLF?

Come si convertono le interruzioni di riga in CRLF in modo che possa scorrere su di esse? Il programma in cui li userò passerà attraverso ogni riga del file, quindi le parole devono essere una per riga.

Questa è una parte del file: bitbackbitebackbiterbackbitersbackbitesbackbitingbackbittenbackboard

Dovrebbe essere:

bit 
backbite 
backbiter 
backbiters 
backbites 
backbiting 
backbitten 
backboard 

Come posso convertire i miei file di questo tipo? Nota: sono 26 file (uno per lettera) con 80.000 parole o meno in totale (quindi il programma dovrebbe essere molto veloce).

Non so da dove iniziare perché non ho mai lavorato con unicode. Grazie in anticipo!

Utilizzando rU come parametro (come suggerito), con questo nel mio codice:

with open(my_file_name, 'rU') as my_file: 
    for line in my_file: 
     new_words.append(str(line)) 
my_file.close() 

ottengo questo errore:

Traceback (most recent call last): 
    File "<pyshell#5>", line 1, in <module> 
    addWords('B Words') 
    File "D:\my_stuff\Google Drive\documents\SCHOOL\Programming\Python\Programming Class\hangman.py", line 138, in addWords 
    for line in my_file: 
    File "C:\Python3.3\lib\encodings\cp1252.py", line 23, in decode 
    return codecs.charmap_decode(input,self.errors,decoding_table)[0] 
UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 7488: character maps to <undefined> 

Qualcuno mi può aiutare con questo?

+0

si potrebbe trovare questo http://stackoverflow.com/questions/3891076/how-to-convert-windows-end-of-line-in-unix-end-of-line-cr-lf-to- Se utile, – dmi3y

+1

, non riesci a rendere il tuo programma in grado di gestire entrambi i tipi di linea che terminano? –

+0

@JamesMcLaughlin Ho già un file con un elenco di parole. Inoltre, non ho mai usato unicode (come detto) quindi non so come gestire questi tipi di finali. –

risposta

16

Invece di conversione, si dovrebbe essere in grado di aprire solo il file utilizzando Python universal newline support:

f = open('words.txt', 'rU') 

(noti la U.)

+2

sembra questo è deprecato ora: https://docs.python.org/3.6/library/functions.html#open – cinatic

9

È possibile utilizzare il metodo di sostituzione delle stringhe. Come

txt.replace('\n', '\r\n') 

EDIT:
nel tuo caso:

with open('input.txt') as inp, open('output.txt', 'w') as out: 
    txt = inp.read() 
    txt = txt.replace('\n', '\r\n') 
    out.write(txt) 
+0

Se vuoi cambiare tutte le terminazioni di riga nello stesso file senza creare un nuovo file di output, guarda la mia risposta qui: http://stackoverflow.com/a/43678795/3459910 – winklerrr

2

Si d non è necessario convertire le terminazioni di riga nei file per poterle scorrere su di esse. Come suggerito da NPE, è sufficiente utilizzare python's universal newlines mode.

L'UnicodeDecodeError accade perché i file che si stanno elaborando sono codificati come UTF-8 e quando si tenta di decodificare il contenuto da byte in una stringa, tramite str(line), Python sta usando la codifica cp1252 per convertire i byte letti dal file in una stringa di Python 3 (cioè una sequenza di punti di codice unicode). Tuttavia, ci sono dei byte in quei file che non possono essere decodificati con la codifica cp1252 e che causano un UnicodeDecodeError.

Se si modifica str(line) in line.decode('utf-8') non si dovrebbe più ottenere l'errore UnicodeDecodeError. Controlla l'articolo Text Vs. Data Instead of Unicode Vs. 8-bit per ulteriori dettagli.

Infine, potresti anche trovare utile The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) di Joel Spolsky.

Problemi correlati