プログラム開発備忘録

プログラム開発備忘録

プログラム開発中に詰まった箇所を備忘録として記録します。

【Python】複数のフォルダから違うファイル名のデータを削除する【Google Colab】

やりたいこと

複数のフォルダから、共通していないファイル名のデータを削除したい

f:id:suda_memo:20211015225711p:plain
フォルダの構造
たとえば、画像のようにデータフォルダA、データフォルダBに共通していない
データ3.csv, データ4.csvを削除したい


作成したコード全体

import os
import glob
from natsort import natsorted

###エラーデータを取り除く
def sort_file(files1,files2,files3,files4):
    i=0
    while True:
        # どれかのファイルが最後の要素になったらwhile文を終了
        if len(files1) < i+1:
            files2 = files2[:i]
            files3 = files3[:i]
            files4 = files4[:i]
            break
        if len(files2) < i+1:
            files1 = files1[:i]
            files3 = files3[:i]
            files4 = files4[:i]
            break
        if len(files3) < i+1:
            files1 = files1[:i]
            files2 = files2[:i]
            files4 = files4[:i]
            break
        if len(files4) < i+1:
            files1 = files1[:i]
            files2 = files2[:i]
            files3 = files3[:i]
            break
                    
        # ファイルパスからファイル名を取得
        file1 = os.path.splitext(os.path.basename(files1[i]))[0]
        file2 = os.path.splitext(os.path.basename(files2[i]))[0]     
        file3 = os.path.splitext(os.path.basename(files3[i]))[0]
        file4 = os.path.splitext(os.path.basename(files4[i]))[0]

        # 日時の部分(10桁目)までをintで取得
        file1_sliced = int(file1[:10])
        file2_sliced = int(file2[:10])       
        file3_sliced = int(file3[:10])
        file4_sliced = int(file4[:10])

        # 同じ日時のデータが揃っているなら次を読み込み、揃っていないなら削除
        if file1_sliced == file2_sliced == file3_sliced == file4_sliced:                        # 揃っているなら次の要素
            i = i+1
            continue
       
        # 最大値より小さいなら削除
        file_max = max(file1_sliced, file2_sliced, file3_sliced, file4_sliced)                # 最大値        
        if file1_sliced < file_max:                                             
            del files1[i]    
        if file2_sliced < file_max:
            del files2[i]
        if file3_sliced < file_max:
            del files3[i]
        if file4_sliced < file_max:
            del files4[i]        
    return files1, files2, files3, files4

###データのあるフォルダの指定
folder_path12 = 'フォルダのパス'
folder_path3 = 'フォルダのパス'
folder_path4 = 'フォルダのパス'
folder_path5 = 'フォルダのパス'

###指定したフォルダ内のファイルのパスを取得
files12 = natsorted(glob.glob("{}/*".format(folder_path12)))
files3 = natsorted(glob.glob("{}/*".format(folder_path3)))
files4 = natsorted(glob.glob("{}/*".format(folder_path4)))
files5 = natsorted(glob.glob("{}/*".format(folder_path5)))

files12,files3,files4,files5 = sort_file(files12,files3,files4,files5)


上記のコードは、ファイル名の最初10桁目までに日時情報が入っているデータを扱っており、4つのフォルダ(files12, files3, files4, files5)すべてに共通するデータのファイルパスが返される