2012-02-29 8 views
1

タブ区切りのテキストファイルを作成し、 。Pythonはファイルに改行を書きます。改行ではなく、਍洀洀洀䄀爀猀猀猀琀givesとなります。

fin = open("in.txt", 'r') 
    fout = open("out.txt", 'w') 

    for line in fin: 

     mrList = line.split('\t') 
     fout.write(mrList[0] + "\t" + mrList[1]) 
     fout.write('\n') 

    fin.close() 
    fout.close() 

これはに行く:

Hello world<tab>how are you?<tab>Groovy 
Like pie?<tab>I love it<tab>omnomnom 
Go pikachu!<tab>Use pound!<tab>She like 

これが出てくる:

Hello world<tab>how are you?਍䰀椀欀攀 瀀椀攀㼀ऀ䤀 氀漀瘀攀 椀琀ഀ 
Go pikachu!<tab>Use pound!਍ 

私は '\ nは' 非常に改行ではないと思われる、そしてそれはその間違い」と主張グーグル\ n 0_0 "

更新日:

以来10

以下の答え、発見されたこと、Linuxのコマンドラインで(ありがとう!):

file peskyInputFile.txt 

はあなたのエンコーディングを指示し、

iconv -c -f utf-16 -t utf-8 peskyInputFile.txt -o outputFile.txt 

がUTF-8にUTF-16ファイルを変換することあなたがUTF16を扱う必要がない場合には面倒を回避します。

+1

可能重複[Pythonは3000行のテキストファイルは、1行の長さであると考えて?](http://stackoverflow.com/questions/2184543/python -thinks-a-3000-line-text-file-is-one-line-long) –

+0

初心者のOPの視点からは "可能な重複"ではありません。提案された複製は受け入れられた答えがなく、一番正しい答えは最後の近くに埋もれていて、問題はLinux上のUTF-16BEテキストファイルでCR(古典的なMac)行ターミネータを読むことでした。現在の問題は、ASCIIであるかのように、LFターミネータを使用してUTF-16テキストファイルを処理しようとしています。 –

+0

@JohnMachinフェアポイント。私は単純に解決策が同じであると主張しています。つまり、特定の症状に関係なく、文字を処理する前のバイトからデコードします。 –

答えて

4

ファイルはUTF-16でエンコードされており、ASCIIのように処理しようとしています。改行を削除すると、1バイトしか消費されないので、UTF-16は次の改行まで1つずつオフになります。解決策と説明については、「Python thinks a 3000-line text file is one line long?」を参照してください。

これは、あなたがやっていることです:の

>>> b = u'Like pie?\tI love it\tomnomnom'.encode('utf-16le') 
>>> s = ('\n' + b + '\0').decode('utf-16le') 
>>> print s 
䰊椀欀攀 瀀椀攀㼀ऀ䤀 氀漀瘀攀 椀琀ऀ漀洀渀漀洀渀漀洀 
関連する問題