3

2 つのファイルがあり、それらの両方で (1 つずつ) 行単位の操作を実行したいと考えています。これを実現するために、現在 2 つのループを使用しています。単一のループでそれを行う方法はありますか(python 2.7):

for fileName in [fileNam1,fileName2]:
    for line in open(fileName):
        do something
4

5 に答える 5

7

指摘されているよう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
于 2012-07-24T07:48:02.103 に答える
4

正確にはあなたが求めているものではありませんが、fileinputモジュールは役に立つかもしれません。

"""すべての標準入力ファイルにループをすばやく書き込むためのヘルパークラス。

典型的な使用法は次のとおりです。

    fileinputをインポートします
    fileinput.input()の行の場合:
        プロセス(行)

これは、sys.argv [1:]にリストされているすべてのファイルの行を繰り返します。
リストが空の場合、デフォルトでsys.stdinになります。ファイル名が「-」の場合
また、sys.stdinに置き換えられます。の代替リストを指定するには
ファイル名、input()への引数としてそれを渡します。単一のファイル名は
また許可されます。

関数filename()、lineno()は、ファイル名と累積行を返します
読み取ったばかりの行の番号。filelineno()は
現在のファイルの行番号。isfirstline()は、
読み取ったばかりの行は、そのファイルの最初の行です。isstdin()はtrueを返します
行がsys.stdinから読み取られた場合。関数nextfile()は、
次の反復で最初の行が読み取られるように、現在のファイル
次のファイル(ある場合)。ファイルから読み取られなかった行はカウントされません
累積行数に向けて; ファイル名は変更されるまで変更されません
次のファイルの最初の行が読み取られた後。関数close()
シーケンスを閉じます。
..。
于 2012-07-24T07:46:34.623 に答える
4

itertoolsモジュールには、まさにそのためのツールがあります。これを試して:

import itertools

for line in itertools.chain(open(file_name1), open(file_name2)):
    # do something
于 2012-07-24T07:40:43.023 に答える
0

おそらく、リスト内包またはマップ、リデュース、フィルターなどを使用して内部ループを回避できます。それはすべて、ニーズによって異なります。あなたは何をしようとしているのですか?

于 2012-07-24T07:44:21.603 に答える
0

これは私の最初の回答ですので、間違っていたらごめんなさい

>>> 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
于 2012-07-24T08:05:59.720 に答える