2017-02-16 7 views
0

2つのディレクトリに最初にファイルを入れ、2番目にファイルを大きくすると、問題が発生します。 iglob大量のファイルに対しては、これは機能しません。2つのディレクトリを反復するときにpython globとiglob

large_n_files = glob.iglob(pathtodir) 
small_n_files = glob.iglob(pathtootherdir) 

for s in small_n_files: 
    for l in large_n_files: 
     print(l,s) 

利回り私はlarge_n_filesためglobに切り替えると、私は私が望む結果を得る

l1 s1 
l2 s1 
l3 s1 

(例えばsmall_n = 2、large_n = 3と仮定)、すなわち

large_n_files = glob.glob(pathtodir) 
small_n_files = glob.iglob(pathtootherdir) 

for s in small_n_files: 
    for l in large_n_files: 
     print(l,s) 

収量

l1 s1 
l2 s1 
l3 s1 
l1 s2 
l2 s2 
l3 s2 

なぜそうですか? (私はイテレータについてもっと学ばなければならないと思います...)もしこれを本当にたくさんのファイルに使用したいのであれば、それほど効率的ではありませんか?これを回避するにはどうしたらいいですか?

答えて

1

あなたが行うと:

small_n_files = glob.iglob(pathtootherdir) 

あなたが戻っイテレータで取得します。つまり、1回だけ反復処理を行うことができます。一方、

あなたは:

large_n_files = glob.glob(pathtodir) 

その後、あなたは複数回繰り返すことができ、リストを作成します。 (small_n_filesの各ループのイテレータオブジェクトを作成します)。あなたは完全なリストをメモリに持っています。あなたが(それは大きなにだとして)メモリにlarge_n_filesを保持したくない場合は、次のコードを使用することができます

small_n_files = glob.iglob(pathtootherdir) 

    for s in small_n_files: 
     for l in glob.iglob(pathtodir): 
      print(l,s) 

あなたは、メモリ内のpathtodirの完全なリストを持っていることはありませんこの方法です。

関連する問題