2012-12-19 39 views
7

オンラインで英語の単語の大部分のリストが見つかりましたが、改行はUNIXスタイル(Unicode:UTF-8でエンコードされています)のものです。 http://dreamsteep.com/projects/the-english-open-word-list.htmlLFをCRLFに変換するにはどうすればよいですか?

改行をCRLFに変換して、それらを反復処理する方法を教えてください。私が使用するプログラムは、ファイル内の各行を通るため、1行に1つの単語が必要です。

これは、ファイルの一部です:bitbackbitebackbiterbackbitersbackbitesbackbitingbackbittenbackboard

それは次のようになります。

bit 
backbite 
backbiter 
backbiters 
backbites 
backbiting 
backbitten 
backboard 

がどのように私はこのタイプに自分のファイルを変換することができますか?注:合計で80,000語程度の26ファイル(1文字につき1ファイル)です(プログラムは非常に速くなければなりません)。

私はユニコードで作業したことがないので、どこから始めるべきか分かりません。前もって感謝します!パラメータとしてrUを使用して

(提案されるように)、私のコードでこれを:

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

私はこのエラーを取得する:

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> 

誰もがこれで私を助けることができますか?

+0

あなたはおそらくこれを見つけることができますhttp://stackoverflow.com/questions/3891076/how-to-convert-windows-end-of-line-in-unix-end-of-line-cr-lf-to-役に立たなかった場合 – dmi3y

+1

プログラムで両方のタイプの行末を処理できるようにできませんか? –

+0

@JamesMcLaughlin私はすでに単語のリストを持つファイルを持っています。加えて、私はユニコードを使用したことはありません(記載されているように)ので、私はどのようにこれらのタイプのエンディングを処理するのか分かりません。 –

答えて

16

代わりの変換、あなただけのPythonのuniversal newline supportを使用してファイルを開くことができます:

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

を(注意してくださいU

+2

それはそうですこれは現在廃止予定です:https://docs.python.org/3.6/library/functions.html#open – cinatic

9

文字列のreplaceメソッドを使用できます。同様

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

EDIT:
あなたのケースで :

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

新しい出力ファイルを作成せずに同じファイル内のすべての行末を変更したい場合は、ここで私の答えを見てください:http://stackoverflow.com/a/43678795/3459910 – winklerrr

2

You dそれらのファイルを繰り返し処理できるように、ファイルの行末を変換する必要はありません。 NPEの提案によると、単純にpython's universal newlines modeを使用します。

あなたが処理しているファイルはUTF-8にエンコードされ、あなたがstr(line)を経由して、文字列にバイトから内容を解読しようとすると、Pythonは、ファイルから読み込んだバイトを変換するcp1252エンコーディングを使用しているためUnicodeDecodeErrorが起こりますPython 3の文字列(すなわち、一連のユニコードコードポイント)に変換します。ただし、これらのファイルには、cp1252エンコーディングでデコードできず、UnicodeDecodeErrorが発生するバイトがあります。

str(line)line.decode('utf-8')に変更すると、UnicodeDecodeErrorを取得できなくなります。詳細については、Text Vs. Data Instead of Unicode Vs. 8-bitの記事をご覧ください。

最後に、Joel SpolskyのThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)も便利です。

関連する問題