2 つのファイルがあり、それらの両方で (1 つずつ) 行単位の操作を実行したいと考えています。これを実現するために、現在 2 つのループを使用しています。単一のループでそれを行う方法はありますか(python 2.7):
for fileName in [fileNam1,fileName2]:
for line in open(fileName):
do something
2 つのファイルがあり、それらの両方で (1 つずつ) 行単位の操作を実行したいと考えています。これを実現するために、現在 2 つのループを使用しています。単一のループでそれを行う方法はありますか(python 2.7):
for fileName in [fileNam1,fileName2]:
for line in open(fileName):
do something
指摘されているようitertools.chain
に、オプションですが、明示的に使用する必要がない別の便利な標準モジュールもありますopen
...
import fileinput
for line in fileinput.input(['file1.txt', 'file2.txt']):
print line
これには、行番号やファイル名などの便利な関数もあります...http://docs.python.org/library/fileinput.htmlのドキュメントを確認してください
コメントへの返信-コンテキストマネージャーでの使用
from contextlib import closing
with closing(fileinput.input(['file1.txt', 'file2.txt'])) as infiles:
for line in infiles:
pass # stuff
正確にはあなたが求めているものではありませんが、fileinputモジュールは役に立つかもしれません。
"""すべての標準入力ファイルにループをすばやく書き込むためのヘルパークラス。 典型的な使用法は次のとおりです。 fileinputをインポートします fileinput.input()の行の場合: プロセス(行) これは、sys.argv [1:]にリストされているすべてのファイルの行を繰り返します。 リストが空の場合、デフォルトでsys.stdinになります。ファイル名が「-」の場合 また、sys.stdinに置き換えられます。の代替リストを指定するには ファイル名、input()への引数としてそれを渡します。単一のファイル名は また許可されます。 関数filename()、lineno()は、ファイル名と累積行を返します 読み取ったばかりの行の番号。filelineno()は 現在のファイルの行番号。isfirstline()は、 読み取ったばかりの行は、そのファイルの最初の行です。isstdin()はtrueを返します 行がsys.stdinから読み取られた場合。関数nextfile()は、 次の反復で最初の行が読み取られるように、現在のファイル 次のファイル(ある場合)。ファイルから読み取られなかった行はカウントされません 累積行数に向けて; ファイル名は変更されるまで変更されません 次のファイルの最初の行が読み取られた後。関数close() シーケンスを閉じます。 ..。
itertools
モジュールには、まさにそのためのツールがあります。これを試して:
import itertools
for line in itertools.chain(open(file_name1), open(file_name2)):
# do something
おそらく、リスト内包またはマップ、リデュース、フィルターなどを使用して内部ループを回避できます。それはすべて、ニーズによって異なります。あなたは何をしようとしているのですか?
これは私の最初の回答ですので、間違っていたらごめんなさい
>>> file1 = open('H:\\file-1.txt')
>>> file2 = open('H:\\file-2.txt')
>>> for i, j in map(None, file1.readlines(), file2.readlines()):
print i,j