2013-04-21 13 views
7

私はユニコード文字の最初の行とそれ以外のすべての行をASCIIで記述したテキストファイルを持っています。 最初の行を1つの変数として読み込み、他のすべての行を別の変数として読み込もうとします。しかし、私は次のコードを使用する場合:Python 2.7のOpen()とcodecs.open()は変わった動作をします

# -*- coding: utf-8 -*- 
import codecs 
import os 
filename = '1.txt' 
f = codecs.open(filename, 'r3', encoding='utf-8') 
print f 
names_f = f.readline().split(' ') 
data_f = f.readlines() 
print len(names_f) 
print len(data_f) 
f.close() 
print 'And now for something completely differerent:' 
g = open(filename, 'r') 
names_g = g.readline().split(' ') 
print g 
data_g = g.readlines() 
print len(names_g) 
print len(data_g) 
g.close() 

を私は次のような出力が得られます。

<open file '1.txt', mode 'rb' at 0x> 
28 

7 

And now for something completely differerent: 

<open file '1.txt', mode 'r' at 0x017875A0> 

28 

77 

私はreadlinesを使用しない場合は()、ファイル全体を読み込み、最初の7行の両方でだけではありませんコーデック.open()とopen()。

なぜこのようなことが起こりますか? なぜ、 'r'パラメータが追加されても、codecs.open()はバイナリモードでファイルを読み込みますか?

UPD:これは、元のファイルです:http://www1.datafilehost.com/d/0792d687

+1

'codecs.open()' *は、デコードする前に改行が見えるように見えるバイトを防ぐためにバイナリモードでファイルを開きます。 UTF-16改行は '\ n \ x00'や' \ x00 \ n'です。 –

+0

元の入力ファイルを共有した方が助かります。 –

+0

@MartijnPieters:あなたの答えをありがとう!ここにファイルがあります:http://wikisend.com/download/406380/1.txt – Kriattiffer

答えて

15

あなたは.readline()最初を使用しているため、codecs.open()ファイルはラインバッファを満たしています。その後の.readlines()の呼び出しでは、が返され、バッファされた行はになります。

あなたは再び.readlines()を呼び出した場合、残りの行が返されます。

>>> f = codecs.open(filename, 'r3', encoding='utf-8') 
>>> line = f.readline() 
>>> len(f.readlines()) 
7 
>>> len(f.readlines()) 
71 

回避策は.readline().readlines()を混在させないことです。

f = codecs.open(filename, 'r3', encoding='utf-8') 
data_f = f.readlines() 
names_f = data_f.pop(0).split(' ') # take the first line. 

この動作は実際にありますバグ。 Pythonの開発者はそれを認識しています。issue 8260を参照してください。

codecs.open()の代わりにio.open()を使用することもできます。 ioライブラリは、Python 3が組み込みのopen()関数を実装するために使用するライブラリであり、codecsモジュールよりはるかに堅牢で汎用性があります。

+0

すばらしいです!私がチェックしたところ、 'code' '。join(data_f)' 'code''と' code'''。join(names_f) 'code'のサイズはほぼ同じです。 – Kriattiffer

関連する問題