2017-12-05 4 views
0

이 질문에 상당한 시간을 보내고 비교적 직설적이어야한다고 생각하지만 계산적으로이를 수행하고 싶습니다 효율적이고 Pythonic 방식.파일 이름에 동일한 키워드가 포함되어 있고 파일 크기가 대략 동일하면

두 개의 목록을 만들었습니다. 하나는 각 파일 이름과 관련된 키워드를 포함하고 다른 하나는 가장 가까운 25 바이트로 반올림 한 해당 파일의 파일 크기를 포함하는 목록입니다. 상당히 초보적인 방법으로 중복 파일을 식별하려고 시도하고 있으며 파일 자체에 텍스트의 측면에서 약간의 차이가있을 수 있지만 일반적으로 간단한 파일 크기 비교가 트릭을 수행해야합니다.

필자의 접근 방식은 파일 이름, 키워드 및 파일 크기를 반복하고 키워드와 크기가 두 번 이상 반복되는 파일 이름을 반환하는 것입니다. 아래의 현재 구현에서는 반복되는 크기가 반드시 특정 키워드와 관련 될 필요가 없다는 점에 유의하십시오 (그러나 필자가 원하는 것은 파일 중복은 파일 크기와 키워드가 거의 동일해야 함). 나는 이것에 대해 지나치게 생각하고 있다고 생각하지만, 여기에 사전을 활용할 것인가?

일부 샘플 파일 이름은 다음과 같습니다 : 다음과 같은

import os, re 

path = 'Enter path here'; os.chdir(path) 
folders = os.listdir(path) 

for folder in folders[:3]: 

    files = os.listdir(path + '\\' + folder); os.chdir(path + '\\' + folder) 

    names = [re.findall(r'vs (.*) on', f)[0] for f in files] 
    sizes = [os.stat(f).st_size for f in files] 
    sizes = [int(25*round(float(s)/25)) for s in sizes] 

    duplicates = [f for f, i, j in zip(files, names, sizes) if names.count(i)>1 and sizes.count(j)>1] 

    print(duplicates) 

원하는 출력이 목록은 다음과 같습니다

여기
United States vs Mexico on 4142017.txt w/ file size of 5282 bytes 
Mexico vs Uruguay on 3272016.txt w/ file size of 5684 bytes 
Spain vs France on 4222017.txt w/ file size of 4883 bytes 
United States vs Mexico on 4152017.txt w/ file size of 5276 bytes 

내가 (나는대로이 작동하지 않습니다 실현) 지금까지 무엇을 가지고 :

['United States vs Mexico on 4142017.txt','United States vs Mexico on 4152017.txt'] 
+0

당신이 '번째 무엇을 쓸 수 단순성의 이점이 있습니다 ,'크기'는 마지막처럼 보인다? – user1767754

답변

1

나는 이런 종류의 일을하는 표준 방법이 defaultdict, f 키워드와 크기의 튜플 (tuple) 인 키들과 일치하는 파일 이름의 목록 인 값을 갖는 사전을 오밍하는 것.

모의 업 예 : 더 중복 키워드 크기의 쌍 항목에 해당하는

from collections import defaultdict 

# input data as a list or sequence of tuples (keyword, size, filename): 
entries = [('foo',3,'foo a'), ('bar',6,'bar b'), ('foo',3,'foo c')] 

d = defaultdict(list) 
for (k,v,f) in entries: 
    d[(k,v)].append(f) 

print [dupe for dupes in d.values() if len(dupes)>1 for dupe in dupes] 

파일 이름은 1보다 큰

가 반복하려면 길이가 사전에 그 항목입니다 목록을 명시 적으로 작성하는 대신에 중복하여 itertools.chain.from_iterable을 사용할 수 있습니다. 하나는 일치하는 모든 파일 이름을 저장 피할 수있다, 그것은 구축으로 사전을 선택하여 - -

이 메모리를 가장 효율적으로 접근 아니지만 names`

+0

여기에 나와있는 일반적인 생각은 올바른 길을 가고 있습니다. 특정 응용 프로그램에 약간의 조정 만 해주시면됩니다. 감사합니다! – rahlf23