2013-09-06 3 views
36

私はfile.txtを開き、このファイルからすべてのデータを分割したいと考えています。ここでスプリット関数add: xef xbb xbf ... n私のリストに

は私file.txt次のとおりです。

some_data1 some_data2 some_data3 some_data4 some_data5 

、ここでは私のpythonのコードは次のとおりです。

>>>file_txt = open("file.txt", 'r') 
>>>data = file_txt.read() 
>>>data_list = data.split(' ') 
>>>print data 
some_data1 some_data2 some_data3 some_data4 some_data5 
>>>print data_list 
['\xef\xbb\xbfsome_data1', 'some_data1', "some_data1", 'some_data1', 'some_data1\n'] 

あなたがここに見ることができるように、私は私のdata_listを印刷するとき、それは、この私のリストに追加します。\xef\xbb\xbfとこれは\nです。これらは何ですか?私はそれらから自分のリストをきれいにすることができます。

ありがとうございました。

+0

もしあなたが 'str.split'に引数を与えなければ、それはすべての種類の空白(任意の組み合わせ)で分割され、副作用として、1行のファイルの最後に改行を取り除きます。 – Blckknght

答えて

55

ファイルには最初にUTF-8 BOMが含まれています。

これを取り除くには、まずファイルの内容をUnicodeにデコードします。

fp = open("file.txt") 
data = fp.read().decode("utf-8-sig").encode("utf-8") 

しかし、より良いutf-8に戻ってそれをエンコードしますが、unicode Dテキストでは動作しません。できるだけ早くユニコードにすべての入力テキストデータをデコードし、ユニコードでのみ動作してください。出力データを必要なエンコーディングにできるだけ遅くエンコードします。これは多くの頭痛からあなたを救うでしょう。

特定のエンコードで大きなファイルを読むには、io.openまたはcodecs.openを使用してください。

thisもチェックしてください。

str.strip()またはstr.rstrip()を使用して、改行文字\nを削除します。

+2

['io.open'](http://docs.python.org/2/library/io.html#io.open)を使用してutf-8モードでファイルを開きます。 –

+0

ここからコンテンツをコピーしてください:http://pastebin.com/raw/4ptxdGex単純な検索を行い、それを削除します。 –

8

\xef\xbb\xbfは、UTF-8のByte Order Mark - \xis an escape sequenceであり、次の2文字が文字コードを表す16進数であることを示します。

\nは改行文字です。これを削除するには、rstrip()を使用します。

data.rstrip() 
data_list = data.split(' ') 

バイト順マークを削除するには、utf-8モードでファイルを開く(あなたが2.6または2.7を使用していると仮定)io.openを使用することができます。 Pythonで実装されているように少し遅くなる可能性があります。速度やPythonの古いバージョンが必要な場合は、codecs.openをご覧ください。

はこのような何かを試してみてください。他の人が述べたように

import io 

# Make sure we don't lose the list when we close the file 
data_list = [] 

# Use `with` to ensure the file gets cleaned up properly 
with io.open('file.txt', 'r', encoding='utf-8') as file: 
    data = file.read() # Be careful when using read() with big files 
    data.rstrip() # Chomp the newline character 
    data_list = data.split(' ') 

print data_list 
4

、あなたがその先頭にUTF-8 BOMが含まれているファイルを扱っています。

彼らはすべてそれをどう対処するか直接削除する方法を教えてくれます。

しかし、1つのスタティックファイル(またはそれらの静的なセット)で作業する必要がある場合は、BOMを積極的に削除して対処する必要があります。

ほとんどのテキストエディタでは、1つのエンコーディングから別のエンコーディングに変換できますが、BOM付きのUTF-8とUTF-8が別々に表示されることがあります。

私の頭に浮かぶ最初のもの(しかし、多くがあります)はメモ帳++です。エンコーディング> BOMなしでUTF-8に変換し、ファイルを保存するだけで設定されます。