2017-02-16 4 views
0

두 개의 디렉토리를 반복 할 때 파일 수가 적은 첫 번째 파일과 큰 파일 수가있는 두 번째 파일에 문제가 발생합니다. iglob 많은 수의 파일에 대해서는 작동하지만 작동하지 않습니다.두 개의 디렉토리를 반복 할 때 파이썬 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) 

수율 (가정 예 small_n = 2 large_n = 3) 내가 large_n_files위한 glob로 전환하면, I, 즉 I 원하는 결과

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 s1 
l2 s1 
l3 s1 
l1 s2 
l2 s2 
l3 s2 

왜 이렇게됩니까? (필자는 iterators에 대해 더 많이 배워야한다고 생각합니다 ...) 정말 많은 수의 파일에 이것을 사용하고 싶지 않다면 덜 효율적일 것입니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

1

당신이 할 경우 :

small_n_files = glob.iglob(pathtootherdir) 

당신은 다시 반복자 얻을; 즉, 한 번만 반복 할 수 있습니다.

large_n_files = glob.glob(pathtodir) 

다음 당신은 당신이 여러 번 반복 할 수있는 목록을 만들 : 당신이 반면에

. (small_n_files의 각 루프에 대한 iterator 객체를 생성합니다). 하지만 당신은 전체 목록을 메모리에 가지고 있습니다.

small_n_files = glob.iglob(pathtootherdir) 

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

당신이 메모리에 pathtodir의 전체 목록을하지 않아도이 방법 :

(이 큰에의로) 당신이 메모리에 large_n_files을 유지하지 않으려면

, 다음과 같은 코드를 사용할 수 있습니다.