tar.gz一括解凍(展開)からのcsv一括チェック

tar.gz一括解凍(展開)からのcsv一括チェック

 圧縮されたtar.gzファイル(csvファイル)の中身をチェックする必要が出てきた。はじめは7-zipを使ってファイルを一つづつ解凍(展開)して作成されたcsvファイルに対して手動でチェックしていたが、tar.gzファイルが10個以上になってくると解凍(展開)にしろ、csvファイルのチェックにしろ面倒になってきた。こんな時こそ、Pythonでツールを作成するべきと考え、tar.gzファイルの一括解凍(展開)からのcsvファイル一括チェックにチャレンジしてみた。

1.tar.gzファイルの一括解凍(展開)

 まずは、tar.gzファイルをフォルダ指定で解凍(展開)すべく、「tar.gz 解凍 python」で検索。
tar.gzファイルをpythonで解凍(展開)するコードは色々あったけど、フォルダ指定で一気に解凍(展開)するというのと、Python見習いにも活用できるレベルで記述されていのは、「【Python】 圧縮されたファイルを一気に解凍したる!」であった。まさに、上記サイトに記されていることがしたかったので、tar.gzファイルの一括解凍(展開)は上記サイトをほぼコピーしております。※コメントもそのまま使用させていただいております。作者さんありがとうございます。おかげさまで、(詳細を理解できていませんが)tar.gzファイルの一括解凍(展開)ができるようになりました。

 上記サイトコードからの変更点はGUIでファイルを指定できるようにしたこと。解凍(展開)後のcsvファイルをtar.gzファイルと同じフォルダではなく、csvフォルダを作成してその中に入れるようにしたこと。以上2点です。
で、tar.gzファイルの一括解凍(展開)コードは以下のとおりです。

#tar.gzファイルを一気に解凍(展開)する。

from tkinter import filedialog
import os
import sys
import tarfile
argvs = sys.argv

# 処理フォルダ指定
path = 'C:'
dir_path = filedialog.askdirectory(initialdir = path)

#フォルダpathを取得する。
path = os.path.dirname(dir_path)

# 特定のディレクトリをなめる
def files(path):
    for pathname, dirnames, filenames in os.walk(path):
        for filename in filenames:
            yield os.path.join(pathname, filename)

# tarボールの解凍
def extract_tar_file(dirname, path):
    with tarfile.open(path, 'r:*') as tar:
        tar.extractall(dirname)

if __name__ == '__main__':
    for path in files(path):
        if path.endswith('.tar.gz'):
            path = path.replace('\\','/')
            # tarボールを保存している一つ一つのディレクトリ抽出
            dirname, basename = os.path.split(path)
            extract_tar_file(dirname + '/csv', path) 

2.csvファイルの一括チェック

 次に解凍(展開)されたcsvファイルを一括チェックする。これについては、いろいろなサイトからつまみ食いしており、どのワードで検索したらどのサイトを読むことができて何が参考になったかは忘れてしまった。検索ワードとしては「python csv 照合 結合」を組み合わせを変えながら検索していたと思う。「結合」というワードにオヤ?と思う人も多いと思うが、自分もそう思った。いろいろなサイトを読んでるうちにcsvファイルの一括チェックには2つのやり方があると分かった。

1.csvファイル一つ一つに対してチェックを行う。
2.csvファイル全てを一つのファイルに結合してからチェックを行う。

で、自分は2番を選択した。というのも、csvファイルに対するチェック処理が一回で済むため楽と考えたため。
あと、チェックしたい内容は以下の通り。
・解凍したcsvファイルのある列(IPアドレス)を抽出してそれらが許可されたIPアドレスかをチェックする。

 解凍したcsvファイルにはIPアドレス以外の情報も含まれているのでヘッダ(1行目のカラムタイトル)をキーとして全IPアドレス(=chkList)を抽出し、それらを許可されたIPアドレス(regList)と比較することで変なIPアドレスが含まれていないことをチェックする。

 IPアドレスチェックにはset型を利用した。(※さらっとset型を利用したと書いていますが、全然理解していません。詳しく知りたい方はPython set型 set()等で検索してください。)このような考え方で作成した「csvファイルの一括チェック」コードが以下です。

#csvのフォルダを指定すること

from tkinter import filedialog
import glob
import pandas as pd

# 処理フォルダ指定
path = 'C:'
dir_path = filedialog.askdirectory(initialdir = path)

#指定フォルダのcsvファイルを結合する。
allFiles = glob.glob(dir_path + "/*.csv")
frame = pd.DataFrame()
list = []
for files in allFiles:
    df = pd.read_csv(files)
    list.append(df)
frame = pd.concat(list)

#csvファイルのIPアドレスを抽出する
chkList = frame['#ここに抽出する列のキーを記述する#']

#登録されているIPアドレス
regList = ['#ここに登録されているIPアドレスを記述する#', '#IPアドレス1#', '#IPアドレス2#']

set_chkList = set(chkList)
set_regList = set(regList)
resultList = set_chkList - set_regList
if resultList == set():
    print('登録されたIPアドレスのみです')
else:
    print('登録されていないIPアドレスが存在します:')
    print(resultList) 

 正直、中身をちゃんと理解していませんが、色々なサイトを参考にしてtar.gzファイルの一括解凍からcsvファイルの一括チェックまでできるようになりました。
 時々、プログラムに詳しい方々からPythonは黒魔術みたいだ!と聞くことがりますが、今回なんとなくその意味がわかりました。中身をちゃんと理解していなくても切った張ったでなんとなくできてしまうなんて、ホント黒魔術みたい。