atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
kohei-hasegawa @ ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
kohei-hasegawa @ ウィキ
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
kohei-hasegawa @ ウィキ
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • kohei-hasegawa @ ウィキ
  • トップページ
  • Python講習
  • 保存フォルダを自動で作成しよう

kohei-hasegawa @ ウィキ

保存フォルダを自動で作成しよう

最終更新:2020年05月14日 20:11

kohei-hasegawa

- view
メンバー限定 登録/ログイン

4-3.保存フォルダを自動で作成しよう


基本的に,Pythonにおけるファイル入出力は実行ファイル.pyと同じパスで行われます.しかし,学術的なシミュレーションでは大量の.csvファイルなどを入出力することが多く,一つのフォルダだけでこれらを管理することは非常に非効率です.そこで,Pythonからファイルの入出力を行うフォルダを変更してあげる必要があります.

(1) カレントディレクトリ
Pythonによるファイル入出力を理解するには,カレントディレクトリ(cd)の概念を理解する必要があります.cdの概念はコマンドプロンプトから学ぶことが出来ます.まずはコマンドプロンプトを開きましょう.すると,C:\Users\K.Hagagawaのような表示が出てきたはずです.これがcdです.コマンドプロンプトは今このディレクトリを見ています.このcdでPythonもファイルの入出力を行います.ファイルの入出力を行うフォルダを変更するというのはcdを変えるということです.cdをコマンドプロンプト上で変えたければcd ディレクトリを入力すればOKです.フルパスでもOKですが,C:\Users\K.Hagagawa\program filiesのようにcdの下層にあるディレクトリであれば,cd 下層パスで指定するディレクトリに移動できます.今回はcd \ program filiesとなります.

Pythonに話を戻せば,cdは基本的に実行する.pyファイルがある場所になります.あるいは,エディタがプロジェクトフォルダを予め指定していればそこがcdとなります.プロジェクトフォルダというのは,メインの実行ファイルを中心にその実行に伴う各種ファイル(.csvや.txtなど)が格納されたcdに相当するフォルダを指します.実行する.pyファイルがあるディレクトリとは別のディレクトリがプロジェクトフォルダとして設定されていた場合,実行に必要な.csvファイルを見つけられなかったり,期待した場所にファイルが出力されないこととなるので注意しましよう.単純に,作成した.pyファイルが一度も保存されておらず,cdが存在しないケースもあります.

では,どうやってカレントディレクトリを探すのか?これは,pythonでファイルを出力すれば良いのです.Pythonで作った何かしらのデータを出力するコードを書き,実際に指定したファイルが生成された場所が.pyファイルのcdです.前ページにあったwith_write.pyはその一例になります.

(2) Pythonによるディレクトリの変更
Pythonは基本的にカレントディレクトリ内でファイルの入出力を行います.しかし,学術的なシミュレーションのように多数のファイルを入出力するケースでは,これらのファイルによって.pyファイルが埋もれてしまったり,入出力ファイルの区別がつかなくなってしまったりととても不便です.もし,pythonのプログラム上でcdを変更し,読み書きするファイルのあるフォルダを変えることができれば非常に便利です.Pythonの標準装備関数にosがあり,これが可能です.ここでは,osを用いたcdの変更やフォルダの自動生成,出力ファイル名の自動生成方法を解説します.

osには様々な関数がありますが,ディレクトリ関係に絞れば以下の通りになります.これをPythonのインタラクティブモードで確認してみます.

os.ディレクトリ系関数
関数 動作
os.getcwd カレントディレクトリを表示
os.dirname ディレクトリを表示
os.chdir ディレクトリを移動する
os.mkdir ディレクトリを作る
os.makedirs ディレクトリを作る(推奨)
os.listdir ディレクトリの中を全てリストにする
os.path.isdir ディレクトリかどうか.あればTrue,なければFalse

>>> import os
>>> os.getcwd
<built-in function getcwd>
>>> os.getcwd()
'C:\\Users\\K.Hagagawa'
>>> os.chdir("../")
>>> os.getcwd()
'C:\\Users'
>>> os.mkdir("./temp")
>>> os.listdir("./")
['All Users', 'Default', 'Default User', 'desktop.ini', 'Eclipse-ccp', 'K.Hagagawa', 'KA7D4~1~HAG', 'Public', 'temp']
>>> os.chdir("./temp")
>>> os.listdir("./")
[]

( )を抜いたgetcdwを実行すると<built-in function getcwd>が出力されます.これはgetcdwがpythonの標準装備関数であることを示してくれています.次に( )を入れたgetcdw( )を実行すると,カレントディレクトリ'C:\\Users\\K.Hagagawa'が表示されます.次にos.chdir("../")を実行します.("../")における..は一つ前のパスに戻る事を意味しています.("./")は現在のパスを意味します.つまり,ピリオドの数がパスの位置を指定しています.よって,os.chdir("../")は一つ前のパスに戻るということです.ここで,再びgetcdw( )を実行すると'C:\\Users\\K.Hagagawa'の上層パスであるC:\\Usersにcdが移りました.このようにos.chdir(" ")使ってpython上でcdを変えられます.

実際にフォルダを作るにはos.mkdir( )を使います.引数は新たに生成するフォルダのパスです.今回は("./temp")とします.すると,cdに新たにフォルダが生成されています.それを確認するにはos.listdir("./")を実行し,cdにあるファルダやファイルのリストを出力させます.すると,os.mkdir("./temp")で生成したtempが生成されたことが分かるかと思います.次にos.chdir("./temp")を使って生成したtempフォルダに移動します.ここにはまだ何もありませんから,os.listdir("./")しても空のリストが出るだけです.

(3) フォルダ名を自動で設定する
とあるシミュレーションの出力先をos.mkdir("./temp")と設定し,再度これを実行するとFileExistsError: [WinError 183] 「既に存在するフォルダを作成することはできません」。と表示され,ファイルが出力されないトラブルに直面します.パラメータを変えるなどで毎回のシミュレーションの結果が変わるケースでは,同じパスに出力を行うのは得策ではありません.シミュレーションに合わせて毎回フォルダを変えるほうが親切です.そこで,os.mkdir("./temp")をシミュレーションの内容や実施時刻に合わせて変更し,そこに出力を保存する手法がしばしば採られます.まずは,シミュレーションのパラメータに合わせてフォルダ名を設定する方法を以下に示します.


os_parameter_folder.py
  1. import os
  2. import numpy as np
  3. row = 5
  4. colum = 10
  5. result = np.random.randint(0,10,(row,colum))
  6. dir = str(row)+”_”+str(colum)
  7. os.mkdir("./temp"+dir)
  8. os.chdir(“./temp"+dir )
  9. for i in range(row):
  10. out = result[i,:] #スライス
  11. np.savetxt(“Result_row_”+str(i)+”.csv”, out, delimiter =”,”)
  12.  
パラメータrowとcolumはシミュレーション前に変更できる変数です.5行目のrandom.randintでrow×columの大きさを持つランダムな整数配列を[0,10)の範囲で生成します.次に,生成するフォルダ名を設定します.str( )を用いてrowとcolumを文字列とし,row_columという文字列dirを作り,os.mkdir("./temp"+dir)とすることでパラメータを反映したフォルダを作成できます.文字列は足し算できるという特徴を用いたテクニックです.ここを保存先とするのでos.chdir(“./temp"+dir )によってcdを変更することを忘れずに.最後にrow×columの大きさを持つランダムな整数配列を行ごとに出力します.ここで,ndarrayであるresultに対して10行目でresult[i,:]を実行しています.これはスライスと呼ばれるものでnumpyの非常に重要な機能の一つです.後ほど詳細は説明しますが,ここではresultの行iのみを切り出しているということだと理解して下さい.これをforループですべての行について行っていると考えて下さい.そして,11行目のsavetxtでResult_row_行数.csvというファイル名で各行を.csvで出力しています.このようにしてパラメータを反映したフォルダに異なる名前のファイルを保存できます.

続いては,フォルダ名に実行時間を反映する例です.これにはdatetimeモジュールを使います.基本的な呼び出しはimport datetimeでOKです.基本的なオブジェクトは以下の4つです.これらに新たなオブジェクトを付与することでさらに詳細な命令を下します.

datetime.datetime:日付+時刻
datetime.date:日付
datetime.time:時刻
datetime.timedelta:時間差・経過時間

datetime.datetime.now()は現在の時間情報というものオブジェクトを意味しています.これに様々な情報が格納されています.今回はこのオブジェクトをdtとしています.従って,このdtの型はオブジェクトを示すclassとなっています.これに.yearを付記すれば,dtの年は?という質問をしていることになります.

次に,これを文字列に変換し,保存ファイル名に反映させます.日時を文字列に変換するにはdatetimeオブジェクトに対して.strftime()メソッドを指定します.ここでは,先程dtオブジェクトから0埋めした西暦,月,日,時,分のデータを取得します.これらのデータを文字列にするには(“%”)という記法が必要になります.この%をディレクティブと言います.datetimeのディレクティブは 公式ドキュメント にすべて記載されています.

%y:下2桁の西暦
%m:0埋めの月
%d:0埋めの日
%H:24h表記の時間
%M:0埋めの分
%Y:4桁の西暦

これにより,time_nowという変数は(西暦-月-日 時間:分,秒)という情報が入った文字列になっています.これをnp.savetxtのファイル名に含めればいいのです.早速,先程のos_parameter_folder.pyにdatetimeを加えてみましょう.ちなみに:はファイルネームとしては無効なので気をつけましょう.こうすれば同じ分で無い限りは実行毎に別々のフォルダ名が生成されます.

os_parameter_folder_datetime.py
  1. import os
  2. import numpy as np
  3. from datetime import datetime
  4.  
  5. dt = datetime.now()
  6. time_now = dt.strftime(“(%Y-%m-%d %H%M)”)
  7. row = 5
  8. colum = 10
  9. result = np.random.randint(0,10,(row,colum))
  10. dir = str(row)+”_”+str(colum)+”_”+time_now #add current time to a new directory name
  11. os.mkdir("./temp"+dir)
  12. os.chdir("./temp"+dir)
  13. for i in range(row):
  14. out = result[i,:]
  15. np.savetxt(“Result_row_”+str(i)+”.csv”, out, delimiter =”,”)
  16.  


コラム7.mkdirとmakedirs

本節ではos.mkdirを紹介しましたが,os.makedirsという関数もあります.実際はこちらの使用が推奨されるかも知れません.理由の1つ目はos.mkdirがUnix環境で動作しないことです.2つ目はos.makedirs(exist_ok=True)とすることでフォルダの重複を許すことが出来るからです.

次へ
「保存フォルダを自動で作成しよう」をウィキ内検索
LINE
シェア
Tweet
kohei-hasegawa @ ウィキ
記事メニュー
メニューを編集

メニュー

トップページ
  • 体裁全般
    • 図表
    • 引用
    • 数式
    • 文章表現
    • ソースコード
  • Officeテンプレ
  • Office Tips
  • 仕事Tips
  • 研究Tips
    • 文献レビュー
    • プレゼンの作り方
    • タスクスケジューラのすゝめ
  • 学位論文
    • 卒業論文
    • 修士論文
    • 博士論文
    • よく使う図表
  • 雑務Tips
    • プレゼン発表練習会
    • M1中間ポスター発表
    • 年度末大掃除
    • D論公聴会
    • 新歓BBQ
    • ソウル東京
    • 製本機の使い方
    • コピー機の使い方
    • 研究室紹介
  • 英語関係
    • 校正全般
    • 自己紹介(Biography)
    • 校正業者の活用方法
    • 英語プレゼン
    • 使えそうな例文
  • 論文執筆
    • タイトル
    • アブストラクト
    • 結果と考察
  • 勉強会
  • Python講習
  • 長谷川の遊び場
    • ダンピング対策状況マップ
    • Twitter拾い物
    • お引越しメモ
    • 本棚
    • 長谷川冒険記

Wiki編集方法

リンク

  • 長谷川のHP
  • 長谷川の予定



記事メニュー2

更新履歴

取得中です。

閲覧数ランキング(昨日)

  • カウンターの値があるページは1つもありません。

閲覧数ランキング(累計)

  • トップページ (4267)
  • トップページ/Python講習 (807)
  • トップページ/雑務Tips/D論公聴会 (578)
  • トップページ/学位論文/博士論文 (481)
  • トップページ/Python講習/オブジェクト指向で体裁を整える (397)
  • トップページ/体裁全般/文章表現 (370)
  • トップページ/長谷川の遊び場/本棚 (345)
  • トップページ/勉強会 (288)
  • トップページ/Office Tips (248)
  • トップページ/Python講習/他にも色々あります (236)


ここを編集
最近更新されたページ
  • 23日前

    メニュー
  • 166日前

    トップページ/長谷川の遊び場/本棚
  • 424日前

    トップページ/長谷川の遊び場/長谷川冒険記
  • 483日前

    トップページ/長谷川の遊び場/Twitter拾い物
  • 966日前

    トップページ/体裁全般/文章表現
  • 1031日前

    トップページ/Office Tips
  • 1175日前

    トップページ/Python講習
  • 1311日前

    トップページ/仕事Tips/国家公務員のためのマネジメントテキスト
  • 1347日前

    トップページ/仕事Tips
  • 1372日前

    トップページ/長谷川の遊び場
もっと見る
最近更新されたページ
  • 23日前

    メニュー
  • 166日前

    トップページ/長谷川の遊び場/本棚
  • 424日前

    トップページ/長谷川の遊び場/長谷川冒険記
  • 483日前

    トップページ/長谷川の遊び場/Twitter拾い物
  • 966日前

    トップページ/体裁全般/文章表現
  • 1031日前

    トップページ/Office Tips
  • 1175日前

    トップページ/Python講習
  • 1311日前

    トップページ/仕事Tips/国家公務員のためのマネジメントテキスト
  • 1347日前

    トップページ/仕事Tips
  • 1372日前

    トップページ/長谷川の遊び場
もっと見る
ウィキ募集バナー
急上昇Wikiランキング

急上昇中のWikiランキングです。今注目を集めている話題をチェックしてみよう!

  1. シュガードール情報まとめウィキ
  2. ストグラFV まとめ@非公式wiki
  3. 作画@wiki
  4. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  5. NIKKEぺでぃあ
  6. MadTown GTA (Beta) まとめウィキ
  7. 本好きの下剋上 有志まとめwiki@5ch
  8. アニヲタWiki(仮)
  9. Fate/Grand Order @wiki 【FGO】
  10. ゆっくり虐め専用Wiki
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 発車メロディーwiki
  8. 鬼レンチャンWiki
  9. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  10. オレカバトル アプリ版 @ ウィキ
もっと見る
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. まどドラ攻略wiki
  2. MadTown GTA (Beta) まとめウィキ
  3. シュガードール情報まとめウィキ
  4. SurrounDead 攻略 (非公式wiki)
  5. R.E.P.O. 日本語解説Wiki
  6. Dark War Survival攻略
  7. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  8. カツドンチャンネル @ Wiki
  9. AviUtl2のWiki
  10. Wplace Wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. スティルインラブ(ウマ娘 プリティーダービー) - アニヲタWiki(仮)
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. 無馬 かな - ストグラ まとめ @ウィキ
  5. 稼ぎ - 地球防衛軍6 @ ウィキ
  6. ミッション攻略 - 地球防衛軍6 @ ウィキ
  7. クレヨンしんちゃん 超華麗!灼熱のカスカベダンサーズ - アニヲタWiki(仮)
  8. シャリア・ブル(GQuuuuuuX) - アニヲタWiki(仮)
  9. ライブセットリスト一覧/初音ミク「マジカルミライ2025」 - 初音ミク Wiki
  10. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.