pythonは重複したファイルを自動的に整理することを実現します。


前言
皆さん、こんにちは、またPythonオフィスオートメーションシリーズになりました。
今日はシステムレベルの自動化事例を共有します。
「指定されたフォルダをPythonで指定されたフォルダの下にファイルの重複がないか確認します。重複があれば削除します。」
主に関連する知識点は以下の通りです。
  • osモジュール総合アプリケーション
  • globモジュール総合アプリケーション
  • filecmpモジュールを利用して二つのファイルを比較する。
  • ステップ分析
    このプログラムで実行されるロジックは、
    指定されたフォルダの下のすべてのファイルを巡回して取得し、入れ子ループを通して2つのファイルが同じかどうかを比較します。同じ場合は後者を削除します。
    問題を実現する鍵は何になりますか?
    二つのファイルが同じかどうかをどう判断しますか?
    ここではfilecmpモジュールを使って、公式の紹介文書を見てみます。
  • filecmp.cmp(f 1,f 2,show=True)
  • は、f 1とf 2という名前のファイルを比較し、等しいと思われたらTrueに戻り、そうでなければFalse
  • に戻る。
  • shallowが本当であれば、同じos.stat()で署名されたファイルは等しいと見なされる。ファイルの内容を比較します。
  • このように使えますか?
    
    #   x y        
    print(filecmp.cmp(x, y))
    # True
    この問題を解決したら、コードを書き始めます。
    Python実現
    必要なライブラリをインポートし、ターゲットフォルダのパスを設定します。
    
    import os
    import glob
    import filecmp
    
    dir_path = r'C:\\xxxx'
    次に、すべてのファイルの絶対パスを巡回して、globモジュールのワイルドカードを利用してrecursiveパラメータを結合すれば完成できます。フレームは以下の通りです。
    
    for file in glob.glob(path + '/**/*', recursive=True):
      pass
    各ファイルまたはフォルダを巡回して取得すると、ファイルかどうかを判断する必要があります。ファイルであれば、絶対パスをリストに保存することができます。ここでは、もう2つのことを完了する必要があります。
  • は、最初に空のリストを作成し、後にlist.append(i)でファイルパス
  • を追加します。
  • は次にos.path.isfile(i)を利用してファイルかどうか判断し、Trueに戻ると追加要素の動作を実行する。
  • 具体的なコードは以下の通りです
    
    file_lst = []
    
    for i in glob.glob(dir_path + '/**/*', recursive=True):
      if os.path.isfile(i):
        file_lst.append(i)
    前のステップでは、ターゲットフォルダの下のすべてのファイルパスを取得しました。次に、このパスリストを巡回して、filecmp.cmpでファイル判断を行い、os.removeでファイル削除を行います。
    
    for x in file_lst:
      for y in file_lst:
        if x != y:
          if filecmp.cmp(x, y):
            os.remove(y)
    ここのコードは大まかな論理を実現しましたが、ファイルが既に前の判定で削除されている可能性があります。os.remove(file)はファイルが存在しないため、エラーが発生しました。
    したがって、os.path.existsでファイルの存在を判断することができます。
    
    for x in file_lst:
      for y in file_lst:
        if x != y and os.path.exists(x) and os.path.exists(y):
          if filecmp.cmp(x, y):
            os.remove(y)
    このようにして、簡単なファイルをリロードして手続きを完了しました。完全なコードは以下の通りです。
    
    import os
    import glob
    import filecmp
    
    dir_path = r'C:\xxxx'
    
    file_lst = []
    
    for i in glob.glob(dir_path + '/**/*', recursive=True):
      if os.path.isfile(i):
        file_lst.append(i)
    
    for x in file_lst:
      for y in file_lst:
        if x != y and os.path.exists(x) and os.path.exists(y):
          if filecmp.cmp(x, y):
            os.remove(y)
    最後に書く
    本論文のPython自動化脚本の制作過程を通して、Pythonのオフィスオートメーションの強さを改めて実感できます。同時に今回実現した機能は以前のファイルを自動的に整理するスクリプトと併用できます。
    以上がpythonです。重複したファイルの詳細を自動的に整理することができます。pythonについて重複したファイルを整理する資料は他の関連記事に注目してください。