2012-12-19 20 views
7

Znalazłem listę większości angielskich słów w Internecie, ale podziały linii mają styl unixowy (kodowany w Unicode: UTF-8). Znalazłem go na tej stronie: http://dreamsteep.com/projects/the-english-open-word-list.htmlJak przekonwertować LF na CRLF?

Jak mogę przekonwertować podziały wierszy na CRLF, aby móc je sprawdzać? Program, w którym będę je stosować, przechodzi przez każdą linię w pliku, więc słowa muszą być jedno w linii.

Jest to część pliku: bitbackbitebackbiterbackbitersbackbitesbackbitingbackbittenbackboard

Powinno być:

bit 
backbite 
backbiter 
backbiters 
backbites 
backbiting 
backbitten 
backboard 

Jak mogę przekonwertować moje pliki do tego typu? Uwaga: to 26 plików (po jednym na literę) z około 80 000 słów (więc program powinien być bardzo szybki).

Nie wiem od czego zacząć, ponieważ nigdy nie pracowałem z Unicode. Z góry dziękuję!

Korzystanie rU jako parametr (jak sugerowane), z tego w moim kodu:

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

otrzymuję ten błąd:

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> 

Czy ktoś może mi pomóc z tym?

+0

możesz ewentualnie znaleźć ten http://stackoverflow.com/questions/3891076/how-to-convert-windows-end-of-line-in-unix-end-of-line-cr-lf-to- Jeśli pomocna jest – dmi3y

+1

Nie możesz sprawić, by twój program był w stanie obsłużyć oba typy zakończenia linii? –

+0

@JamesMcLaughlin Mam już plik z listą słów. Ponadto nigdy nie używałem Unicode (jak wspomniano), więc nie wiem, jak obsługiwać tego typu zakończenia. –

Odpowiedz

16

Zamiast konwersji, powinieneś być w stanie po prostu otworzyć plik, używając Pythona universal newline support:

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

(Zauważ, że U.)

+2

wydaje się jest to obecnie przestarzałe: https://docs.python.org/3.6/library/functions.html#open – cinatic

9

Można użyć metody zamiany ciągów. Jak

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

EDIT:
w przypadku:

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

Jeśli chcesz zmienić wszystkie zakończenia linii w tym samym pliku bez tworzenia nowego pliku wyjściowego, spójrz na moją odpowiedź tutaj: http://stackoverflow.com/a/43678795/3459910 – winklerrr

2

You d nie trzeba konwertować końcówek wierszy w plikach, aby móc je iterować. Zgodnie z sugestią NPE, po prostu użyj python's universal newlines mode.

UnicodeDecodeError dzieje, ponieważ pliki są przeróbki są kodowane jako UTF-8, a kiedy próbują rozszyfrować zawartość z bajtów na łańcuch, poprzez str(line), Python używa kodującego cp1252 konwertować bajtów odczytanych z pliku w łańcuch Python 3 (tj. sekwencja punktów kodowych Unicode). Jednak w plikach tych znajdują się bajty, których nie można dekodować za pomocą kodowania cp1252 i które powodują UnicodeDecodeError.

Jeśli zmienisz str(line) na line.decode('utf-8'), nie powinieneś już otrzymywać kodu UnicodeDecodeError. Zapoznaj się z zapisem Text Vs. Data Instead of Unicode Vs. 8-bit po więcej szczegółów.

Wreszcie, może ci się przydać również Joann Spolsky The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).

Powiązane problemy