インポートとパスの確認
前回、温度・湿度ロガーのデータ分析のため、フォルダ構造を考えてみました。

フォルダ構造が決まったので、今回はこの部分のプログラミングをしてみましょう。
まずは今回使うosモジュールとshutilモジュールをインポートします。
import os
import shutil
osモジュールはフォルダの作成などに、shutilモジュールはフォルダの削除に用います。
とりあえず現在いる場所を変数pathに保存して、合っているかちょっと確認。
import os
import shutil
path = os.getcwd()
print(path)
実行結果
/Users/username/Desktop/inkbird-3/test
現在は「/Users/username/Desktop/inkbird-3/test」にいると表示され、合っていることが確認できました。
問題ないことが分かったので、「print(path)」は行の最初に#をつけて、コメントアウトしておきます。
現在のパス内のファイル・フォルダ名の取得
次にこのフォルダ内にどんなファイル、フォルダがあるか確認します。
この際、os.listdir(“フォルダ”)でフォルダ内のファイル・フォルダのリストを取得します。
そしてfor文で一つ一つ表示してみます。
import os
import shutil
path = os.getcwd()
# print(path)
for f in os.listdir(path):
print(f)
実行結果
.DS_Store
temperature_testdata1.csv
inkbird_plotter_ver0.1.ipynb
.ipynb_checkpoints
「.DS_Store」はMac特有のフォルダなので気にしないでください。
「.ipynb_checkpoints」はAnacondaが自動で作成する自動保存用フォルダなので気にしないでください。
「inkbird_plotter_ver0.1.ipynb」は現在作成しているPythonプログラムのファイルです。
「temperature_testdata1.csv」が温度・湿度が入ったデータです。
フォルダ名のみ取得
ここで欲しいのはフォルダだけなので、os.path.isdir(“ファイルかフォルダ名”)を使って、フォルダのみ取得します。
このos.path.isdir(“X”)はXがフォルダの場合、「True」という値を返します。
またフォルダでない場合、「False」という値を返します。
そこでif文を用いて、os.path.isdir(“X”)がTrueとなる場合を場合分けします。
またTrueとなった時のフォルダ名をリストに移しておきます
import os
import shutil
path = os.getcwd()
# print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
print(dirnames)
実行結果
['.ipynb_checkpoints']
ということでフォルダである「.ipynb_checkpoints」が取得できました。
ちなみに「.DS_Store」もフォルダなのですが、何故か表示されませんでした。
特に重要でもないので放置しておきます。
確認できたので、「print(dirnames)」はコメントアウトしておきます。
Data、Graphフォルダがない場合、フォルダの作成
現状ではDataフォルダ、Graphフォルダがないので、これらのフォルダがない場合からプログラミングしていきましょう。
「if “X” not in “Y”:」で「Yというリストの中にXがない場合」という場合分けをすることができます。
そしてos.mkdir(“フォルダ名”)でフォルダを作成します。
import os
import shutil
path = os.getcwd()
# print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
# print(dirnames)
if "Data" not in dirnames:
os.mkdir("Data")
if "Graph" not in dirnames:
os.mkdir("Graph")
このプログラムを初めて実行する場合、DataとGraphというフォルダが作成されます。

Data、Graphフォルダがある場合、フォルダを削除し、再作成
次にData、Graphフォルダがある場合、まずはこれらのフォルダを削除し、再度同じData、Graphフォルダを作成します。
shutil.rmtree(“フォルダ名”)でフォルダの中身があろうがなかろうがフォルダを削除できます。
そして再度os.mkdir(“フォルダ名”)でフォルダを作成します。
import os
import shutil
path = os.getcwd()
# print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
# print(dirnames)
if "Data" not in dirnames:
os.mkdir("Data")
elif "Data" in dirnames:
shutil.rmtree("Data")
os.mkdir("Data")
if "Graph" not in dirnames:
os.mkdir("Graph")
elif "Graph" in dirnames:
shutil.rmtree("Graph")
os.mkdir("Graph")
これでData、Graphフォルダがある、なしに関わらず、新しいData、Graphフォルダを作るプログラムができました。
関数化
このままでは色々と無駄がありますし、今後、同じプログラムを書く可能性があるので、関数化していきます。
今回、関数化しておくのは、この部分。
if "Data" not in dirnames:
os.mkdir("Data")
elif "Data" in dirnames:
shutil.rmtree("Data")
os.mkdir("Data")
if "Graph" not in dirnames:
os.mkdir("Graph")
elif "Graph" in dirnames:
shutil.rmtree("Graph")
os.mkdir("Graph")
DataフォルダとGraphフォルダを確認、作成する部分ですが、これは”Data”と”Graph”という対象が違うだけで、プログラムとしては同じものになっています。
そこでこの部分を関数としてしまいましょう。
関数化するにはdef関数を用います。

引数としては、作りたいフォルダ名と現在のフォルダ内のフォルダ名のリストの二つが必要です。
それらを2つの引数、dirnameとdirlistとして関数にしてみました。
import os
import shutil
def dir_check(dirname, dirlist):
if dirname not in dirlist:
os.mkdir(dirname)
elif dirname in dirlist:
shutil.rmtree(dirname)
os.mkdir(dirname)
path = os.getcwd()
# print(path)
dirnames = []
for f in os.listdir(path):
if os.path.isdir(f) == True:
dirnames.append(f)
# print(dirnames)
dir_check("Data", dirnames)
dir_check("Graph", dirnames)
これでフォルダの確認と作成(再作成)を関数化できました。
ちょっとスッキリした感じで見えますよね?
とりあえず今回はここまでとしておきましょう。
次回はファイルを読み込み、値を取得するところを作成したいと思います。

ということで今回はこんな感じで。
コメント