2017-04-08 11 views
0

大きなファイルに改行文字を取り除く必要があるf私は一度に2行ずつ解析しています。例えばこのような。Python:複数の行レコードをforループで構文解析し、生成元を使ってstr.rstrip()を呼び出す

def foo(f): 
    with open(f, "r") as f: 
    for n, s in zip(f, f): 
     #something with `n` and `s` 

はそれがforループラインに直接str.rstripすることが可能であるか、私はforループ本体内別にそれを実行する必要があります。これは、(それがより簡潔にするために更新質問)for n, s in zip(f.rstrip(), f.rstrip()):

動作しない

UPDATE:

def foo2(f): 
    with open(f, "r") as f: 
    for n, s in zip ((line.rstrip() for line in f), (line.rstrip() for line in f)): 
     #Do something with `n` and `s` 

:以下PaulCorneliusからBarmarの回答やコメントから

これらのソリューション

def foo3(f): 
    with open(f, "r") as f: 
    g = (line.rstrip() for line in f) 
    for n, s in zip(g, g): 
     #Do something with `n` and `s` 

UPDATE 2:

あなたはいくつかのファイルを解析したい場合は1(ここでは二つのファイル)ファイルごとに1つの発電を行うことができます。

def foo4(f1, f2): 
    with open(f1, "r") as f1, open(f2, "r") as f2: 
    g1, g2 = (line.rstrip() for line in f1), (line.rstrip() for line in f2) 
    for n1, s1, n2, s2 in zip(g1, g1, g2, g2): 
     #Do something with `n1`, `s2, `n2` and `s2` 

答えて

1

あなたはリストの内包表記を使用することができます。

for n1, n2 in zip([line.rstrip() for line in f1], [line.rstrip() for line in f1]): 

ただし、一度に2行ずつファイルを処理しません。各リストの理解度はファイル全体を処理するので、n1n2は同じ行のコピーになります。

私は、彼らが怠け者だので、あなたは、あなたの代わりにジェネレータ式を使用して欲しいものを得ることができると思います。

for n1, n2 in zip ((line.rstrip() for line in f1), (line.rstrip() for line in f1)): 
+0

ああ - 素敵。それは体のラインよりも効率的でしょうか? – user3375672

+1

おそらくほぼ同じです。 – Barmar

+0

OPは 'f1'からのものと' f2'からのものの代わりに、 'f1'からの2行を使うつもりはありませんか? – gyre

関連する問題