2013-04-21 30 views
7

Unicode karakterlerin ilk satırı ve ASCII'deki diğer tüm satırları içeren bir metin dosyası var. İlk satırı bir değişken olarak ve diğer tüm satırları bir diğeri olarak okumayı deniyorum. Ancak, aşağıdaki kodu kullandığınızda: Aşağıdaki çıktıyı almakPython 2.7'de Open() ve codecs.open() Garip bir şekilde farklı davranıyor

# -*- 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 

Ben readlines(), tüm dosya değil sadece ilk 7 satır hem okur kullanmazsanız codecs.open() ve open().

Neden böyle bir şey oluyor? Ve neden 'r' parametresine rağmen, codecs.open() ikili modda dosya okuyor?

Upd: codecs.open() dosyası bir linebuffer doldurdu, http://www1.datafilehost.com/d/0792d687

+1

'codecs.open()' *, * kod çözme işleminden önce yorumlanan yeni satırlara benzeyen baytları önlemek için dosyayı ikili modda açar *. Örneğin UTF-16 satırsonları '\ n \ x00' veya' \ x00 \ n' dir. –

+0

Orijinal giriş dosyanızı paylaşırsanız yardımcı olur. –

+0

@MartijnPieters: Cevabınız için teşekkürler! İşte dosya: http://wikisend.com/download/406380/1.txt – Kriattiffer

cevap

15

Eğer .readline()ilk kullanılan Çünkü;: Bu orijinal dosya .readlines() numarasına yapılan sonraki çağrı, numaralı arabelleğe yalnızca döner satırları döndürür.

Eğer .readlines()tekrar dersek, çizgilerin kalanı iade edilir:

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

iş çevresinde .readline() ve .readlines() karışmaz şudur:

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

Bu davranış gerçekten bir böcek; Python devleri bunun farkındadır, bkz. issue 8260.

Diğer seçenek codecs.open() yerine io.open(); io kitaplığı, Python 3'ün yerleşik open() işlevini uygulamak için kullandığı ve codecs modülünden çok daha sağlam ve çok yönlü olduğu.

+0

Harika! Kontrol ettim ve 'code '' 'boyutlarını birleştir. Join (data_f)'' code' ve 'code' ''. Join (names_f)' code' neredeyse eşittir. – Kriattiffer