본문 바로가기
프로그래밍/Python

[Python] 디렉토리 내부의 동일한 파일 찾기

by Hwan,. 2022. 12. 10.
728x90
반응형

 이름이나 확장자는 다르지만 사실 동일한 파일이 있다.

이 2개의 파일을 코드로 구분하려면 어떻게 해야 할까? 그리고 디렉토리 내에 그런 파일들이 여러개 있다면 어떻게 찾을 수 있을까?

 

아래 파일은 get_tickers.py를 복사하여 .txt로 확장자를 바꾼 동일한 파일이다. 2개의 파일이 사실은 같다는 걸 코드로 확인해보자.

 

 파일이 동일하다는 걸 확인하려면 파일 전체를 해쉬로 만들어 값을 비교해보면 된다.

코드로 작성해보자.

import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.sha512()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

file_a = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py"
file_b = "C:\\Users\\Hwan\\Desktop\\TestDir\\get_tickers.py.txt"
hash_a = my_hash(file_a)
hash_b = my_hash(file_b)

print(file_a)
print(file_b)
print(hash_a)
print(hash_b)
print(hash_a == hash_b)

파일의 내용을 sha512로 해싱해주는 함수를 작성했다.

코드를 실행하면 이름과 확장자는 달라도 내용은 같다는 걸 알 수 있다.

 

 폴더 내부를 전체 탐색하기 위해 아래 코드를 작성했다.

import os

workspace = "C:\\Users\\Hwan\\Desktop\\TestDir"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        
print(list_result)

 

코드를 실행하면 입력받은 경로 밑의 (경로나 파일 명에 pass가 포함되지 않은) 모든 파일을 리스트에 담아준다.

 

이제 입력한 경로 내의 모든 동일한 파일을 찾도록 아래의 코드를 추가했다.

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]

딕셔너리의 키로 파일 내용을 해싱한 값을 줬고, 값으로는 해당 해쉬값을 갖는 파일명 리스트를 담았다.

 

아래는 전체 코드이다.

import os
import hashlib

def my_hash(file):
    with open(file, 'rb') as f:
        read_data = f.read()
        hash = hashlib.md5()
        hash.update(read_data)
        hexSHA512 = hash.hexdigest()
        hashValue = hexSHA512.upper()

    return hashValue

workspace = "C:\\Users\\hwan\\Desktop"
keywords = ["pass"]
list_result = []

for file in os.walk(workspace):
    if any([True if keyword in file[0] else False for keyword in keywords]): continue
    
    for x in file[2]:
        list_result.append(file[0] + "\\" + x)
        

dict_hash = {}     
for file in list_result:
    try:
        dict_hash[my_hash(file)].append(file)
    except:
        dict_hash[my_hash(file)]= [file]
        
for x in dict_hash:
    if len(dict_hash[x]) > 1:
        print(x, dict_hash[x])

 

728x90
반응형

'프로그래밍 > Python' 카테고리의 다른 글

QR-CODE 생성하기  (2) 2023.03.29
[Python] requirements.txt로 패키지 설치하기  (0) 2023.01.12
FastAPI  (0) 2023.01.12
[Python] Docstring  (0) 2022.11.27
[Python] OS 모듈 : 디렉토리 전체 탐색하기 (하위 디렉토리까지)  (0) 2022.11.20
[python] JWT 모듈  (0) 2022.09.13

댓글