2017-10-19 4 views
2

디렉토리의 파일을 통과하려고 시도하고 중복 파일을 찾아서 삭제합니다. 브 루트 포스를하는 것은 하루 이상 걸릴 것입니다 그래서 나는 디렉토리에 29 000 파일이 있습니다. 나는 다음과 같습니다 파일 이름이현재 파일의 파이썬 루프

:

"some_file_name" "일부 파일 이름"

그래서 하나 개의 이름은 밑줄을 가지고 있으며, 다른 하나는 대시를 가지고 있으며, 때로는 2 개 또는 세 개의 반점이 떨어져서.

그래서 내 안쪽 루프를 디렉터리의 바깥 쪽 루프 위치에서 시작하여 다음 10 개만 확인하도록 하시겠습니까?

가 여기 내 폭력 코드 : 나는 당신의 질문에서 이해하는 것과

import glob, os 
os.chdir("C:/Dir/dir") 

for file in glob.glob("*"): 
    temp = file 
    temp = temp.replace("-", " ") 
    temp = temp.replace("_", " ") 

#How do I start this loop where file is currently at and continue for the next 10 files 
for file2 in glob.glob("*"): 
    temp2 = file2 
    temp2 = temp2.replace("-", " ") 
    temp2 = temp2.replace("_", " ") 
    if temp == temp2: 
     os.remove(file2) 
+0

는 콘텐츠에 의해 또는 유사하여 중복을 찾을 하시겠습니까 이름 혼자? – Tomalak

+0

데이터 구조 (집합 또는 목록)를 사용하여 두 번 반복 (temp1 및 temp2)하는 대신 이미 방문한 파일 이름을 추적 해 보았습니까? 이렇게하면 각 파일을 한 번만 반복하면됩니다. – pills

답변

3

, 당신은 디렉토리에서 비슷한 이름의 파일을 삭제합니다. 나는 당신의 접근법 ("다음 10 개의 파일 이름을 보라")이 너무 부정확하고 너무 복잡하다고 생각한다.

some_file_name 파일과 some-file-name 파일이 모두있는 경우 그 중 하나를 삭제하십시오.

이것은 파일 이름 목록을 작성하고 각 항목에 대해 대시 대신 밑줄이있는 파일 이름이 있는지 확인한 다음 삭제할 경우 매우 쉽게 수행 할 수 있습니다.

다음은 set을 사용합니다. 세트는 매우 좋은 검색 특성을 가지고 있습니다. 즉, some_value in some_set은 목록보다 훨씬 빠릅니다. 또한 우리는 이미 세트를 만들 때 존재하는 모든 파일을 알고 있기 때문에 파일 존재 확인 (예 : os.path.isfile(file))을 과도하게 피할 필요가 없습니다.

import glob, os 

filenames = {file for file in glob.glob(r"C:\Dir\dir\*")} 

for file in filenames: 
    delete_candidate = file.replace("-", "_") 
    if delete_candidate != file and delete_candidate in filenames: 
     os.remove(delete_candidate) 
     print("deleted " + delete_candidate) 

{x for x in iterable} 그것은 값 목록에서 집합을 구축하는 세트 이해이다. 그것은 목록 내포와 똑같이 작동합니다.

당신은 사전을 사용하고 (_없이 또는 -)은 "간단한 이름"을 넣을 수
+0

집합 이해를 위해'{}'를 사용하면 생성자 – Uriel

+0

D' oh를 생성했습니다. 당연하지. – Tomalak

+0

고마워, 지금은 바보 같아. 그것은 실제로 매우 간단한 해결책입니다, 그래도 그럼에도 불구하고 고맙습니다. – user3918910

0

값으로 모든 실제 파일 이름을 키로과 :

import glob, os 

def extendDictValue(dDict, sKey, uValue): 
    if sKey in dDict: 
     dDict[sKey].append(uValue) 
    else: 
     dDict[sKey] = [uValue] 


os.chdir("C:/Dir/dir") 
filenames_dict = {} 
for filename in glob.glob("*"): 
    simple_name = filename.replace("-", " ").replace("_", " ") 
    extendDictValue(filenames_dict, simple_name, filename) 

for simple_name, filenames in filenames_dict.items(): 
    if len(filenames) > 1: 
     filenames.pop(0) 
     for filename in filenames: 
      os.remove(filename)