Knowhow/Python

중복 파일 검사 후 삭제/이동/복사

침닦는수건 2023. 3. 16. 14:54
반응형

데이터 처리를 하다가 수작업으로 몇몇 파일들을 걸러내면 다른 폴더에서도 대응되는 파일들을 걸러내는 것이 너무 귀찮았다. 

 

가령 multi-camera로 이미지를 취득한 뒤에, 1번 카메라를 기준으로 이미지를 선별하고 나면 나머지 카메라 이미지들도 이에 맞추어 선별해주어야 하는데 매번 파일 이름을 기억했다가 지워주는게 번거로웠다.

 

이런 식의 편집은 매번 코드를 짜서 해결했었는데 꽤 빈번하게 일어나는 것 같아서 파일 이름으로 비교하는 코드를 작성해서 저장해두고자 한다.

 

def compare_files(ref_dir, src_dir):
    ref_names = sorted(os.listdir(ref_dir))
    src_names = sorted(os.listdir(src_dir))

    ref_extension = ref_names[0].split('.')[-1]
    src_extension = src_names[0].split('.')[-1]

    ref_names = [ref_name.split(".")[0] for ref_name in ref_names] # extension type not included
    src_names = [src_name.split(".")[0] for src_name in src_names]  # extension type not included

    ref_names = set(ref_names)
    src_names = set(src_names)

    matches = src_names.intersection(ref_names)
    deletes = src_names.difference(ref_names)
    matches = [match + "." + src_extension for match in matches]
    deletes = [delete + "." + src_extension for delete in deletes]

    return matches, deletes

기준이 되는 ref_dir과 비교 대상이 되는 src_dir이 주어졌을 때, 해당 디렉토리 안에 있는 파일들을 이름(확장자 제외)을 기준으로 비교하고 동시에 존재하는 것과 src_dir에만 존재하는 것을 return한다. 

 

ref_dir을 수작업으로 편집한 뒤라면 이 함수를 통해 src_dir에서 편집해야하는 파일 이름들을 얻을 수 있다. 

 

def delete_files(dir_path, file_names):
    for file_name in file_names:
        file_path = os.path.join(dir_path, file_name)
        if os.path.exists(file_path):
            os.remove(file_path)
            print(f"{file_path} is removed!")

def move_files(src_dir, dst_dir, file_names):
    for file_name in file_names:
        src_path = os.path.join(src_dir, file_name)
        dst_path = os.path.join(dst_dir, file_name)
        shutil.move(src_path, dst_path)
        print(f"{src_path} is moved to {dst_path}!")

def copy_files(src_dir, dst_dir, file_names):
    for file_name in file_names:
        src_path = os.path.join(src_dir, file_name)
        dst_path = os.path.join(dst_dir, file_name)
        shutil.copy2(src_path, dst_path)
        print(f"{src_path} is copied to {dst_path}!")

대표적으로 삭제/이동/복사를 많이 써서 위와 같이 함수도 짜두었다. 삭제는 진짜 원본 파일을 지우는 것이니까 주의!

 

 

반응형

'Knowhow > Python' 카테고리의 다른 글

python에서 yaml 다루기, PyYAML vs ruamel.yaml  (0) 2023.06.09