# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# ! explorer .

# # ファイルの整理

# ## 課題  
# たまった写真をGOOGLE DRIVEに入れたい  
# しかし、写真を貯めているフォルダの構造は、めちゃくちゃで、重複しているファイルもある。フォルダのサイズは80GB！  
# とても手作業でやる気が起こらないので、スクリプトを組んだ

# ## 方針
# * フォルダ内に同一ファイル名が存在しないように、一括でリネームする。
# * フォルダ内のファイルを全てpandas dataframeに格納
# * ハッシュなるものを使って、同一ファイルを抽出、pandas dataframeで重複ファイルの無いリストを作る
# * 上記のリストのファイルを新しいフォルダに移動
# * 最後に人が見ながら、不要なファイルを削除

# # スクリプト

# +
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) <NAME>
# 
###############################################################################
import os,hashlib

class env_copy_right():
    '''
    working_dirにあるファイルのパスとハッシュを取得する
    '''
    def __init__(self):
        self.file_list = []

    def get_list(self,working_dir):
        for root, dirs, files in os.walk(working_dir):
            for filename in files:
                fname=os.path.join(root, filename)
                with open(fname, 'rb') as f:
                    checksum = hashlib.md5(f.read()).hexdigest()
                self.file_list.append([fname,checksum])     
                
if __name__ == '__main__':
    working_dir = "D:\\新しいフォルダー"
    obj=env_copy_right()
    obj.get_list(working_dir)
# -

# ## 取得したファイルを片っ端からリネーム

# +
import os
x=0

for i in obj.file_list:
    root, ext = os.path.splitext(i[0])
    pa=root+"kiroku_"+str(x)+ext
    print(pa)
    os.rename(i[0], pa)
    x=x+1
# -

# ## データフレームを作成

import pandas as pd
df=pd.DataFrame(obj.file_list)
df.columns = ["path","checksum"]  #カラム名を付ける

# ## 重複を削除してdf1として再定義

df1=df.drop_duplicates(['checksum'])

df1=df1.reset_index( drop = True )
df1

# ## df1のファイル名を取得

import os, shutil
file_name_list=[]
for i, v in df1.iterrows():
    print(v['path'])
    p=os.path.basename(v['path'])
    file_name_list.append(p)

file_name_list

# ## データフレームに追加

df2=pd.DataFrame(file_name_list)
df2.columns = ["file_name"]
df2

# ## 同一ファイル名が無い事を確認（今回、階層をなくしたいため）

# ### ファイル名の重複を確認

df2.duplicated(['file_name']).any()

# ### 重複している場合は、ファイル名を出力する

df3=df2.apply(pd.value_counts)
df3.loc[(df3["file_name"] > 1)]

# ## ファイル名をデータフレームに追加する

df1=df1.join(df2)

df1

# ## ファイルをコピー

# + run_control={"marked": false}
ls=list(df1["path"])
# -

# ls

import shutil
for i in ls:
    shutil.copy(i, "D:\\pic")

# # 構成部品

# ## ハッシュとは

# ハッシュ値、大きくアバウトに言ってしまうと、データを特定するするために、あるアルゴリズム（関数）から算出される値。
# 簡単な例では、データの同一性をチェックするための「チェックサム」もその１つ。コンパイラの高速テーブル検索でもハッシュが使われる。
# 「チェックサム」では、データを一定のビット数で区切ってその総和を、送り側で計算してデータに付加しておく。これが「チェックサム」といわれるの由来。
# 受け側でこの「チェックサム」を除く、純データの「チェックサム」を計算し直し、付き合わせることでデータの同一性をかなりの高確率で保証できる。

import hashlib
# fname="test_file - コピー"
fname="test_file"
# fname="haikei_2.ipynb"
with open(fname, 'rb') as f:
    checksum = hashlib.md5(f.read()).hexdigest()
checksum

# ## ファイルパス

# +
import os

working_dir = 'C:\\Users\\mineo\\Anaconda3\\envs\\mine01'
file_list = []
for root, dirs, files in os.walk(working_dir):
    for filename in files:
        file_list.append(os.path.join(root, filename)) 
#     print(file_list)
#     df_list = [pd.read_table(file) for file in file_list]
#     if df_list:
#         final_df = pd.concat(df_list) 
#         final_df.to_csv(os.path.join(root, "Final.csv"))
file_list
# -

len(file_list)

# ## 合成

hikaku_1=set()
for i in file_list:
    hikaku_1.add(i[0]+"_____hash_____"+i[1])

hikaku_1

len(hikaku_1)

# ## 重複ファイルの確認
# ハッシュでソートして、同じハッシュのファイルを表示する

df.sort_values(by=["checksum"], inplace=True, ascending=False)
df=df.reset_index( drop = True )

df1=df.apply(pd.value_counts)

df2=df1.loc[(df1["checksum"] > 1)]

# + run_control={"marked": true}
pd.set_option("display.max_colwidth", 80)
df3=df.loc[(df["checksum"] == df2.index[10])]
df3["path"]


StarcoderdataJupyterScriptsDedupFiltered