2010-12-08 2 views
0
fileHandle = open(filedir, 'r') 
content = fileHandle.read().split('\n') 
for e in content: 
    if (e == '' or (e[0] != r"@"): 
     content.remove(e) 
fileHandle.close() 

を誤動作ようだ、私はここでやろうとしていることは、いくつかのテキストを使用してファイルを開き、行に分割して、@で起動しないこれらの行を削除しています。しかし、代わりに、いくつかの点では、それはちょうどより多くの行を取り除かないし、コンテンツの中に '@'の終わりがないものもあります。どうして?Pythonのlist.removeは()だから、

答えて

3

リストの項目を反復処理しないで削除しないでください。

が理由だけではなく、次の操作を行いません:あなたはそれを反復処理している間

with open(filedir) as f: 
    lines = [line.rstrip("\r\n") for line in f if line.startswith("@")] 
+0

リストのすべての要素が\ nで終わっていればいいです。それをうまく処理する上品な方法はありますか? –

+0

'f.readlines'?真剣に? – SilentGhost

+1

@kenny:あなたはドキュメントを読むのに気を使うことができますか? – SilentGhost

1

あなたはそれを繰り返しているので、あなたはリストにうんざりしています。さらに、行単位で取得するには、ファイルを繰り返し処理する必要があります。さらに、結果を書き出すことさえできません。

with open(filedir, 'r') as fileHandle: 
    with open(outputfile, 'w') as outputHandle: 
    for line in fileHandle: 
     if not line or line.startswith('@'): 
     continue 
    outputHandle.write(line) 
2

コンテナを改造しないでください。

これは多くの点で複雑です。ファイルを明示的に閉じる必要はありません(with -blockを使用)。 @を指定するのに "生の文字列"を使う必要はありません。あなたは "〜で始まる"を発明する必要はありません。ファイルを複数の行に分割する必要はありません(ファイルを繰り返し実行するだけで、一度に1行ずつデータが得られます)。独自のループを書く必要はありません。

ファイル内の「@」で始まる行のリストが必要です。それで、直接それに尋ねてください:

with open(filedir, 'r') as fileHandle: 
    content = [line for line in fileHandle if line.startswith('@')] 
0

あなたは反復しているものを修正するべきではありません。私はあなたのコードにいくつかの変更を加えてコメントを付けてここに再掲載しました。

fileHandle = open(filedir, 'r') 
content = (x.strip() for x in fileHandle.readlines()) # Get all the lines and use a genexp to strip out the spaces. 
for e in content[:]: # Python idiom for "copy of a list" 
    if (e == '' or (e[0] != r"@"): 
     content.remove(e) 
fileHandle.close() 

これは、[:]演算子の例です。私はまだイグナシオの解決策をこの上にお勧めしたいと思います。