2012-01-17 15 views
2

私はreadlines関数を使ってファイルからすべての行を読み込み、さらにリストの各行を解析しているコードを持っています。しかし、私がリストを印刷したとき、私はループがファイルの最後の行を無視しているのを見ました。ファイルに空行を挿入すると、すべての内容が読み込まれます。readlineはpythonでファイルの最後の行を読み取っていません

def readFile1(file1): 
    f = file1.readlines() 
    cList1 = [] 
    for line in f: 
     if re.findall('\n',line): 
      v = re.sub('\n','',line) 
     cList1.append(v) 

    print cList1 

これは、ファイルの最後の行を除くすべての内容を印刷していることをやっているなぜあなたは、plsは私に言うことができます。

+2

最後の行の後に改行がありますか? – joaquin

+1

正規表現を使用して、特定の場所(文字列の末尾)に一度しか見つからない単一文字の「すべてのインスタンス」を削除しますか?本当に?これはPerlではありません。正規表現は大惨事です。このようなコードを書くことは、あなたの意図を大いに曖昧にし、あなた自身のために物事を困難にします。 –

答えて

11

最後の行が改行で終わらない場合、コードはcList1にコードを追加しません。その代わりに、最後から2番目の行(まだvに格納されています)の2番目のコピーが追加されます。確かに、

cList1 = [] 
for line in f: 
    cList1.append(line.rstrip('\n')) 

または::

そのループを記述するためにクリーンな方法がある

cList1 = [line.rstrip('\n') for line in f] 

実際には、私は完全にreadlines()コール避けるだろう:

def readFile1(file1): 
    cList1 = [line.rstrip('\n') for line in file1] 
    print cList1 
+0

はいu r右..それはvに格納されている行の2番目のコピーを追加しています... lemmeここで示唆した方法を試してください – rain

0

をご最後の行には、その行の後に改行がないため\ n文字はありません。

0

print fは、実際にはすべての行を印刷します。これはあなたのコードのバグです。最後の行には\nが含まれていないため、2行目から2行目を2回追加します。あなたは不足しています。 elseブロックに\nが含まれていない場合はvを割り当てます。

+0

はいこれもケースかもしれません.. – rain

1

ファイルからリストにすべての行を取得したい場合は、がもっと簡単で、私の考えでは、方法はです。

def readFile1(file1): 
    cList1 = file1.read().splitlines() 
    print cList1 

この場合、発電機を使用する必要はありません。また、私はベンチマークして(Windows上で)、@ aixが与えたジェネレータ形式は若干遅いです場合によってはです。

>>> import timeit 
>>> import os 
>>> 
>>> # Setup 
>>> open('testfile', 'w').write('This Is A Test' * 500) 
>>> 
>>> # Time generator form (ten thousand times) 
>>> timeit.timeit("lst = [line.rstrip('\\n') for line in open('testfile')]", 
...  number=10000) 
2.656837282256163 
>>> 
>>> # Time splitlines() form (ten thousand times) 
>>> timeit.timeit("lst = open('testfile').read().splitlines()", number=10000) 
1.3464799954204238 
>>> 
>>> # Cleanup 
>>> os.remove('testfile') 
関連する問題