Python에서 간단한 파일 청소기를 구축하는 방법

안녕하십니까,
오늘 Python 프로그래밍을 사용하는 방법을 배울 것입니다. 모든 중복 항목을 삭제하면 드라이브의 많은 공간을 절약할 수 있습니다.

소개


많은 경우, 디스크에 중복된 파일이 있는 것을 발견하지만, 수동으로 그것들을 추적하고 검사하는 것과 관련이 있을 때, 매우 지루할 수도 있다.

여기에 해결 방안이 하나 있다


프로그램을 작성하여 디스크를 추적하고 찾은 모든 중복 항목을 삭제할 수 있습니다. 전체 디스크를 추적해서 중복 항목이 있는지 확인하지 않고 인코딩을 사용하여 이 과정을 자동화할 수 있습니다. 이것이 바로 본고의 내용입니다.

근데 우리 어떻게 하지?


만약 우리가 전체 파일을 읽고 주어진 디렉터리를 통해 나머지 파일과 차례로 비교한다면, 이것은 매우 긴 시간이 걸릴 것이다. 그러면 우리는 어떻게 해야 합니까?
답은 해시입니다. 해시는 주어진 알파벳과 숫자 문자열을 생성하여 주어진 파일의 표지로 삼을 수 있습니다. 만약 우리가 같은 표지를 가진 다른 파일을 발견한다면, 우리는 그것을 삭제할 것입니다.

여러 가지 산열 알고리즘이 있습니다. 예를 들어
  • md5
  • sha1
  • sha224,sha256, SH384 및 SH512
  • 인코딩 좀 해달래요.


    Python의 해시는 매우 간단합니다. Hashlib 라이브러리를 사용합니다. 기본적으로 Python 표준 라이브러리와 함께 제공됩니다.
    다음은hashlib 산열 내용을 어떻게 사용하는지 예시입니다.md5 산열 알고리즘을 사용하여Python에서 산열 문자열을 사용합니다

    사용 예


    >>> import hashlib
    >>> example_text = "Duplython is amazing".encode('utf-8')
    >>> hashlib.md5(example_text).hexdigest()
    '73a14f46eadcc04f4e04bec8eb66f2ab'
    
    간단합니다.hashlib를 가져와md5 방법으로 해시를 만들고, 마지막으로hexdigest로 해시 문자열을 생성합니다.
    위의 예는 문자열을 산열하는 방법을 보여 주었지만, 우리가 구축하고자 하는 프로젝트와 관련이 있을 때, 우리가 더욱 관심을 가지는 것은 문자열이 아니라 파일이다. 또 다른 문제가 생겼다.

    우리는 어떻게 파일을 산열합니까?


    산열 파일은 산열 문자열과 유사하지만 약간 다르다. 산열 파일 동안, 우리는 먼저 바이너리로 파일을 열고 파일 바이너리 값의 산열을 생성해야 한다.

    해시 파일


    프로젝트 디렉터리에learn이라는 간단한 텍스트 문서가 있다고 가정하십시오.txt, 이것이 바로 우리가 해야 할 일이다.
    >>> import hashlib
    >>> file = open('learn.txt', 'rb').read()
    >>> hashlib.md5(file).hexdigest()
    '0534cf6d5816c4f1ace48fff75f616c9'
    
    위에서 보듯이 두 번째로 해시를 생성하려고 해도 같은 파일이면 해시 값이 바뀌지 않습니다.
    우리가 매우 큰 파일을 읽으려고 시도할 때, 도전이 생겼다. 파일을 불러오는 데 시간이 걸리기 때문에, 전체 파일이 메모리에 들어가기를 기다리는 것이 아니라, 파일을 읽을 때 해시 값을 계속 계산할 수 있다.
    파일을 읽을 때 해시를 계산하려면 크기가 지정된 블록으로 파일을 읽고 전체 파일에 대한 해시가 끝날 때까지 해시를 계속 업데이트해야 합니다.
    이렇게 하면 대량의 대기 시간을 절약할 수 있고, 우리는 이 시간으로 전체 파일이 준비될 때까지 기다릴 수 있다.

    사용 예


    >>> import hashlib
    >>> block_size = 1024
    >>> hash = hashlib.md5()
    >>> with open('learn.txt', 'rb') as file:
    ...     block = file.read(block_size)
    ...     while len(block)>0:
    ...             hash.update(block)
    ...             block = file.read(block_size)
    ...     print(hash)
    ... 
    0534cf6d5816c4f1ace48fff75f616c9
    
    보시다시피, 해시는 그것을 바꾸지 않았기 때문에, 우리도python을 구축하여 이 일을 완성할 준비가 되어 있습니다.
    그러나 해시를 기다리는 것은 하나의 절차일 뿐이다. 우리는 실제 중복 항목을 삭제하는 방법이 필요하다. 우리는 내장된python 모듈 운영체제를 사용하여 중복 항목을 삭제할 것이다.
    Python OS remove () 방법을 사용하여 드라이브의 반복 항목을 제거합니다.
    우리 공부를 삭제해 봅시다.txt 및 운영체제 모듈

    사용 예제 (운영 체제 모듈):


    >>> import os
    >>> os.listdir()
    ['Desktop-File-cleaner', '.git', 'learn.txt', 'app.py', 'README.md']
    >>> os.remove('learn.txt')
    >>> os.listdir()
    ['Desktop-File-cleaner', '.git', 'app.py', 'README.md']
    
    이것은 매우 간단합니다. 삭제할 파일 이름을remove () 로 호출합니다.이제 응용 프로그램을 구축합시다.

    우리의 청결 도구를 구축하다


    필요한 라이브러리 가져오기


    import time
    import os
    from hashlib import sha256
    
    나는 대상을 대상으로 프로그래밍하는 것을 매우 좋아한다. 본고에서 우리는 우리의 도구를 하나의 클래스로 구축할 것이다. 다음은 우리 코드의 외골격 클래스이다.
    import time
    import os
    from hashlib import sha256
    
    class Duplython:
        def __init__(self):
            self.home_dir = os.getcwd(); self.File_hashes = []
            self.Cleaned_dirs = []; self.Total_bytes_saved = 0
            self.block_size = 65536; self.count_cleaned = 0
    
        def welcome(self)->None:
            print('******************************************************************')
            print('****************        DUPLYTHON      ****************************')
            print('********************************************************************\n\n')
            print('----------------        WELCOME        ----------------------------')
            time.sleep(3)
            print('\nCleaning .................')
    
        def main(self)->None:
          self.welcome()
    
    if __name__ == '__main__':
        App = Duplython()
        App.main()
    
    이것은 Python 프로그램의 초기 표지일 뿐입니다. 이 프로그램을 실행할 때, 환영 방법만 화면에 출력합니다.
    출력:
    $ python3 app.py
    ******************************************************************
    ****************        DUPLYTHON      ****************************
    ********************************************************************
    
    ----------------        WELCOME        ----------------------------
    ​
    Cleaning .................
    
    이제 우리는 위에서 배운 해시 지식을 이용하여 주어진 경로를 가진 파일을 만드는 간단한 함수를 만들어야 한다.
    import time
    import os
    from hashlib import sha256
    
    class Duplython:
        def __init__(self):
            self.home_dir = os.getcwd(); self.File_hashes = []
            self.Cleaned_dirs = []; self.Total_bytes_saved = 0
            self.block_size = 65536; self.count_cleaned = 0
    
        def welcome(self)->None:
            print('******************************************************************')
            print('****************        DUPLYTHON      ****************************')
            print('********************************************************************\n\n')
            print('----------------        WELCOME        ----------------------------')
            time.sleep(3)
            print('\nCleaning .................')
    
       def generate_hash(self, Filename:str)->str:
            Filehash = sha256()
            try:
                with open(Filename, 'rb') as File:
                    fileblock = File.read(self.block_size)
                    while len(fileblock)>0:
                        Filehash.update(fileblock)
                        fileblock = File.read(self.block_size)
                    Filehash = Filehash.hexdigest()
                return Filehash
            except:
                return False
    
        def main(self)->None:
          self.welcome()
    
    if __name__ == '__main__':
        App = Duplython()
        App.main()
    

    이제 프로그램 논리를 실현합시다.


    현재, 우리가 함수를 만들어서 파일의 주어진 경로에 따라 해시를 생성한 후에, 이 해시를 비교하고 발견된 중복 항목을 삭제하는 것을 실현할 수 있습니다.
    나는 다음과 같이 clean () 이라는 간단한 함수를 만들었다.
    import time
    import os
    from hashlib import sha256
    
    class Duplython:
        def __init__(self):
            self.home_dir = os.getcwd(); self.File_hashes = []
            self.Cleaned_dirs = []; self.Total_bytes_saved = 0
            self.block_size = 65536; self.count_cleaned = 0
    
        def welcome(self)->None:
            print('******************************************************************')
            print('****************        DUPLYTHON      ****************************')
            print('********************************************************************\n\n')
            print('----------------        WELCOME        ----------------------------')
            time.sleep(3)
            print('\nCleaning .................')
    
       def generate_hash(self, Filename:str)->str:
            Filehash = sha256()
            try:
                with open(Filename, 'rb') as File:
                    fileblock = File.read(self.block_size)
                    while len(fileblock)>0:
                        Filehash.update(fileblock)
                        fileblock = File.read(self.block_size)
                    Filehash = Filehash.hexdigest()
                return Filehash
            except:
                return False
    
        def clean(self)->None:
            all_dirs = [path[0] for path in os.walk('.')]
            for path in all_dirs:
                os.chdir(path)
                All_Files =[file for file in os.listdir() if os.path.isfile(file)]
                for file in All_Files:
                    filehash = self.generate_hash(file)
                    if not filehash in self.File_hashes:
                        if filehash:                       
                            self.File_hashes.append(filehash)
                            #print(file)
                    else:
                        byte_saved = os.path.getsize(file); self.count_cleaned+=1
                        self.Total_bytes_saved+=byte_saved
                        os.remove(file); filename = file.split('/')[-1]
                        print(filename, '.. cleaned ')
                os.chdir(self.home_dir)
    
        def main(self)->None:
          self.welcome();self.clean()
    
    if __name__ == '__main__':
        App = Duplython()
        App.main()
    
    현재 우리의 프로그램은 거의 완성되었고, 우리는 청결 과정의 요약을 인쇄하기 위해 간단한 방법을 추가해야 한다.
    저장된 메모리 바이트 수입니다.
    나는 이미 방법cleaning\usummary()를 실현했다. 바로 이렇게 하기 위해서 청소 과정의 요약을 화면에 인쇄하면 우리의python 도구를 완성할 수 있다. 아래와 같다.
    import time
    import os
    import shutil
    from hashlib import sha256
    
    class Duplython:
        def __init__(self):
            self.home_dir = os.getcwd(); self.File_hashes = []
            self.Cleaned_dirs = []; self.Total_bytes_saved = 0
            self.block_size = 65536; self.count_cleaned = 0
    
        def welcome(self)->None:
            print('******************************************************************')
            print('****************        DUPLYTHON      ****************************')
            print('********************************************************************\n\n')
            print('----------------        WELCOME        ----------------------------')
            time.sleep(3)
            print('\nCleaning .................')
    
        def generate_hash(self, Filename:str)->str:
            Filehash = sha256()
            try:
                with open(Filename, 'rb') as File:
                    fileblock = File.read(self.block_size)
                    while len(fileblock)>0:
                        Filehash.update(fileblock)
                        fileblock = File.read(self.block_size)
                    Filehash = Filehash.hexdigest()
                return Filehash
            except:
                return False
    
        def clean(self)->None:
            all_dirs = [path[0] for path in os.walk('.')]
            for path in all_dirs:
                os.chdir(path)
                All_Files =[file for file in os.listdir() if os.path.isfile(file)]
                for file in All_Files:
                    filehash = self.generate_hash(file)
                    if not filehash in self.File_hashes:
                        if filehash:                       
                            self.File_hashes.append(filehash)
                            #print(file)
                    else:
                        byte_saved = os.path.getsize(file); self.count_cleaned+=1
                        self.Total_bytes_saved+=byte_saved
                        os.remove(file); filename = file.split('/')[-1]
                        print(filename, '.. cleaned ')
                os.chdir(self.home_dir)
    
        def cleaning_summary(self)->None:
            mb_saved = self.Total_bytes_saved/1048576
            mb_saved = round(mb_saved, 2)
            print('\n\n--------------FINISHED CLEANING ------------')
            print('File cleaned  : ', self.count_cleaned)
            print('Total Space saved : ', mb_saved, 'MB')
            print('-----------------------------------------------')
    
        def main(self)->None:
            self.welcome();self.clean();self.cleaning_summary()
    
    if __name__ == '__main__':
        App = Duplython()
        App.main()
    
    응용 프로그램이 완료되었습니다. 응용 프로그램을 실행하려면 완료되었습니다. 정리할 특정 폴더에서 응용 프로그램을 실행하면 모든 파일을 찾아서 중복 파일을 삭제합니다.
    출력 예:
    $ python3 app.py 
    ******************************************************************
    ****************        DUPLYTHON      ****************************
    ********************************************************************
    ​
    ​
    ----------------        WELCOME        ----------------------------
    ​
    Cleaning .................
    0(copy).jpeg .. cleaned 
    0 (1)(copy).jpeg .. cleaned 
    0 (2)(copy).jpeg .. cleaned 
    
    ​
    -------------------FINISHED CLEANING ------------
    File cleaned  :  3
    Total Space saved :  0.38 MB
    ----------------------------------------------------
    
    이 게시물이 재미있었으면 좋겠어요. 이제 트위터와 다른 개발자 커뮤니티에서 친구들과 공유할 때가 됐어요.
    이 문장의 Original Articlekalebujordan.com 에서 찾을 수 있다

    카레브 / 쌍마라송


    CLI 도구, 지정된 디렉토리의 모든 중복 파일 차례로 제거


    쌍마라송


    Duplython이란 무엇입니까?


    Duplython은 간단한 cli 프로그램으로 Python을 사용하여 주어진 디렉터리의 중복 파일을 차례로 삭제할 수 있습니다

    그것은 어떻게 일합니까?


    Duplython underhood는 해시를 사용하여 모든 파일이 이미지 | 음악 | 동영상에 유일한 해시를 가지고 있는지 검사할 수 있습니다. 따라서 해시를 가진 두 파일이 있으면 그 중 하나는 삭제됩니다.

    입문


    이 도구를 사용하려면 이 저장소를 복제하거나 다운로드해야 할 수 있습니다.
    $->git 클론https://github.com/Kalebu/Duplython

    의존항


    설치할 필요가 없습니다. 이 도구에 사용된 모든 라이브러리와 모듈은Python 표준 라이브러리에서 찾을 수 있습니다.

    프로젝트 디렉토리로 이동


    프로젝트 저장소에 들어가면 앱이라는 스크립트를 볼 수 있습니다.py, 중복 항목을 지우기 위해 폴더의 맨 위 디렉터리로 이동합니다...
    View on GitHub

    좋은 웹페이지 즐겨찾기