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