パソコン仕事5倍塾
35,000人を指導した東大卒・元日本IBM社内講師が直伝
MENU
aliceさんの投稿
(投稿ID: 5394)
小川 慶一さんのコメント
(コメントID: 7869)
import os.path import shutil from datetime import datetime, timedelta from pathlib import Path scr_path = Path('D:', 'temp', 'backup_test', 'コピー元', ) dst_path = Path('D:', 'temp', 'backup_test', 'コピー先', ) for sub_dir in scr_path.glob('**'): # 直下に限らずすべてのフォルダ群を取得 for item in sub_dir.iterdir(): # フォルダじゃなかったら -> つまり、ファイルだったら if not Path.is_dir(item): # タイムスタンプ調査 before_10_days = datetime.today() + timedelta(days=-10) update_time = datetime.fromtimestamp(item.stat().st_mtime) if before_10_days >= update_time: # 10日前より前のファイルだったらコピー対象 # コピー先のフォルダパスを決定する # # 例えば、コピー元が D:temp\backup_test\from\hoge\fuga\220827_file3.png だったら # dst_path に、 ('hoge', 'fuga',) を結合したものがコピー先フォルダ # ここに、 220827_file3.png をコピーすることになる # # ところで、pathlib.Path は parts という属性内から、絶対バスの情報を tuple で取り出せる # このサンプルを例に取れば、以下のとおり: # scr_path.parts # -> ('D:', 'temp', 'backup_test', 'from', ) # item (つまり、 D:temp\backup_test\from\hoge\fuga\220827_file3.png) の item.parts # -> ('D:', 'temp', 'backup_test', 'from', 'hoge', 'fuga', '220827_file3.png', ) # # ついては、この両者を比較して、コピー先のパスを作成する # 具体的には、両者は先頭から scr_path.parts の長さ分だけ同じなので、 # item.parts からその分を切り捨てる # # このサンプルであれば、len(scr_path.parts) は 4 になる # なので、item.parts[4:] で ('hoge', 'fuga', '220827_file3.png') を得られる # フォルダパス相当の ('hoge', 'fuga',) だけが欲しいなら、item.parts[4:-1] # この[4:] の 4 の部分を scr_path.parts を利用して動的に生成するならば、 # 4 の代わりに、 len(scr_path.parts) とすれば良い。 # # 参考までに、コピー対象ファイルのファイル名は、 item.name でも item.stem でも item.parts[-1:] でもどれでもいける # # なお、こういう情報は、 item を得られる状態でブレークポイントで実行を中断し、 # [Alt] + [F8] から item のプロパティをいろいろ調べると見当がつきます # 僕も、このコードを書く前からすべて把握していたわけではありません # ご自身でも同様の操作をしつつ動作確認して、自分でイチから書いて、として、腕力つけてください backup_dir_list = item.parts[len(scr_path.parts):-1] backup_dir = dst_path / Path(*backup_dir_list) # backup_dir_list を展開して引数リストを渡す if not os.path.exists(backup_dir): # 上記で生成した backup_dir が存在しない場合は生成する os.makedirs(backup_dir) shutil.copy(item, backup_dir) print('完了しました')
for sub_dir in scr_path.glob('**'): # 直下に限らずすべてのフォルダ群を取得 for item in sub_dir.iterdir(): # フォルダじゃなかったら -> つまり、ファイルだったら if not Path.is_dir(item):
aliceさんのコメント
(コメントID: 7871)
(コメントID: 7873)
Worksheets(7).Range("F" & saki).Value = Worksheets(5).Range("C" & moto).Value '[1] Worksheets("決算").Range("F" & saki).Value = Worksheets("8月集計").Range("C" & moto).Value '[2]
(コメントID: 7875)
(コメントID: 7876)
田中 宏明さんのコメント
(コメントID: 7877)
(コメントID: 7879)
(コメントID: 7880)
(コメントID: 7883)
Captcha:
たった1ヶ月で人生が劇的に変わりました
佐藤信さん
役員クラスの方から高い評価を受けるようになりました。
佐賀県 - 岩本徹さん
今までまったく知らなかったショートカットキーを使いまくっています。
東京都 - 鷹觜慶さん
年齢60才間近、営業で外回りの時間が多い私でも退社時間が1-2時間程度早くなりました。
東京都 - 宗内隆明さん
受講前もすでにパソコン得意でしたが、そんな私でも受講して本当に良かったと思えた講座です。
東京都 - 佐伯とも子さん
ここまで包括的に仕事に役立つ深い学びを受けれた講座は初めてでした
東京都 - 飯田倫子さん
2024年12月15日 22:47
2024年12月14日 06:16
2024年12月02日 10:35
2024年11月30日 11:04
2024年11月27日 09:59
2024年12月17日 07:25
2024年12月17日 05:44
2024年12月16日 10:51
2024年12月16日 10:02
2022年02月24日 10:59
表示できる投稿はありません。
この学習サイトの教材制作、サポート、システム開発をすべてやっています。
2022年02月02日 00:00
2022年02月02日 03:00
2022年02月02日 06:00
2022年02月02日 09:00
2022年02月02日 12:00
2024年12月19日 11:30
2024年12月18日 13:30
2024年10月21日 17:30
2024年10月18日 17:00
2024年10月17日 17:30
2024年11月27日 11:48
2024年11月25日 12:07
2024年11月17日 09:51
2024年11月15日 16:41
2024年11月15日 13:07
aliceさんの投稿
(投稿ID: 5394)
動画でアドバイスをいただけるとは思っていなかったのでドキドキしながら拝見しました。
私の思考がぐちゃぐちゃなのがよくわかりました。
いやーひどいですね(lll¬ω¬)
私の頭の中ぐちゃぐちゃだなー、ひどいなー以外の感想が思いつきません。
ちなみに「コメント欄に書いたようなコードを書きたかった」のではなく、「やりたいことをするにはそれしか思いつかなかった」がというのが現状です…。
日本語でロジックを書いてみたのですが、まぁひどいですね( ̄_ ̄|||)
年末くらいには今書いているコードを見て成長を感じられるくらいになっていたらいいなと思います。
ご提案いただいたリライトもどのように書けばいいのか思いつかないので、調べながらチャレンジしてみます。
まずはモジュールレベル変数を関数に渡さずに使わないように気を付けます。
ありがとうございました!
小川 慶一さんのコメント
(コメントID: 7869)
なお、以下は、もっとシンプルに書けそうな気もしますが...。ささっと試した範囲ではうまくいかなかったので、構造3つになってしまっています。
aliceさんのコメント
(コメントID: 7871)
質問というか相談なのですが、このお題について、もし小川先生が私の立場だったら次のステップとして何をされますか?
私が思いつく選択肢としては次の2つです。
①小川先生が提案されたロジック(動画8:08くらい)を小川先生のコードを見ないでやってみる
②小川先生が書かれたコードをじっくり読みながら書いてみる
普段の私だと①なのですが、なんかいつもと同じ選択をするのも違うような気がしていて…。
いつもと違う選択をすると②なのですが、ここは選択肢③先に行っている人に聞いてみる!を選んで質問させていただきました。
それと別件なのですがAPIの件もありがとうございます。
少し時間をください。
というよりなんで私はあんなにリストを使っていたのでしょうか?辞書の方がkeyを指定すれば値をとれるから便利なのに…、と思っています(^^;
小川 慶一さんのコメント
(コメントID: 7873)
今回だと、実質13行しかないコードなので、僕だったら、弄って遊びつつ、何度か写経しつつ、としてまずは慣れて、あとは、見ながらでもいいから本気で書いていって、次第に何も見ないで(ウェブ上のドキュメント/解説記事参照可、エディタの支援機能可)で書いていって...としつつ、タイムトライアルしますかね。
つまり、「②小川先生が書かれたコードをじっくり読みながら書いてみる」だけでなくて、「手早く書き上げる」練習もおり交ぜて。
あとは、エクセルマクロの演習のころから言っているとおり、「横に誰かがいて、その人に教えてあげているかのように、説明しつつ書く」ですね。
説明してみると、自分がどこが分かっていないのかがよく分かります。
あとは、さらに余裕があれば、 docs.python.org で今回登場した機能を検索して、その近傍に紹介されているメソッド等をさらっと眺めるかもしれません。(あくまで、余裕があれば。今はないだろうと思いますので...あくまで、今後に向けての参考までに)
> というよりなんで私はあんなにリストを使っていたのでしょうか?辞書の方がkeyを指定すれば値をとれるから便利なのに…、と思っています(^^;
慣れてないからだと思いますよ。
慣れてしまえば、辞書のほうが、インデックスに文字列を使えるので便利です。
エクセルマクロでもそうですよね。
たくさんシートがあったとして、 Worksheets(7) と番号で指定するより、 Worksheets("決算") とシート名で指定するほうが可読性、メンテナンス性が高いです。
aliceさんも、エクセルマクロだったら、以下の[1]よりも[2]を好むものと思います。
Pythonにも、そのときと同じ感覚で触れてください。
小川 慶一さんのコメント
(コメントID: 7875)
> ①小川先生が提案されたロジック(動画8:08くらい)を小川先生のコードを見ないでやってみる
これはないかな...と思います。
今回の場合、設計段階から見直さなくてはならないので。(というか、あれを直しつつ今回僕が提示したものに持っていくほうが大変です)
「まがりなりにも、書ききった」という経験を頼りに、僕が提示したコードを読んで体感していくのが良いかと思います。
aliceさんのコメント
(コメントID: 7876)
「②小川先生が書かれたコードをじっくり読みながら書いてみる+手早く書き上げる練習」でいきたいと思います(●'◡'●)
>弄って遊びつつ
その心の余裕がなかったです(^^;
>「横に誰かがいて、その人に教えてあげているかのように、説明しつつ書く」ですね。
>説明してみると、自分がどこが分かっていないのかがよく分かります。
その視点は抜け落ちていました。ありがとうございます。
step1 慣れるまで書いてみる(弄って遊びつつ、何度か写経する)
step2 見ながらでもいいから本気で書く
step3 次第に何も見ないで(ウェブ上のドキュメント/解説記事参照可、エディタの支援機能可)で書く
step4 タイムトライアルをする
step5 docs.python.org で今回登場した機能を検索して、その近傍に紹介されているメソッド等をさらっと眺める(余裕があれば)
※横に誰かがいて、その人に教えてあげているかのように、説明しつつ書く(説明してみると、自分がどこが分かっていないのかがよく分かる)
まずは、step1から始めてみます(❁´◡`❁)
今回はファイルの操作でしたが、他のことを学ぶときにも同じ方法で学んで行こうと思います。
openpyxlの演習にstep5+教えているつもりで書くですね。
忘れないようにメモしておきます!
ちなみに、普段の私は「①小川先生が提案されたロジック(動画8:08くらい)を小川先生のコードを見ないでやってみる」です(^^;
その結果このようなことを感じていました。
・とりあえず完成はするけどそのときに使ったメソッドなどを覚えている(他の場面で使える)気がしない
・サクッとできるときは楽しいけど、はまるとものすごく疲れる
かけている時間に対して絶対効率悪いなーと感じていたので、ご回答いただけて嬉しいです。
> ①小川先生が提案されたロジック(動画8:08くらい)を小川先生のコードを見ないでやってみる
>これはないかな...と思います。
このように言っていただけてスッキリしました。
ありがとうございます!
最近は煮詰まったときに質問するタイミングが難しいなーと感じています。
ある程度時間をかければ自分で解決できることが多いのですが、質問した方が自分では考えつかなかった方法を提示していただけるので聞いた方がいいんだろうなーと思いつつ、どのタイミングで聞いたらいいんだろう?と思っています。
>エクセルマクロでもそうですよね。
>たくさんシートがあったとして、 Worksheets(7) と番号で指定するより、 Worksheets("決算") とシート名で指定するほうが可読性、メンテナンス性が高いです。
エクセルマクロに例えていただけるとよくわかります。
ひどいコードでしたが学ぶことがたくさんあったので、ノートに投稿して良かったです!
ありがとうございます!
田中 宏明さんのコメント
(コメントID: 7877)
いつも横からすみません。
まずは「10日前より前のファイルだったらコピー」を思いつき、
それを実現したaliceさんの勝ちだと思います。
ここから先、技術的な高みを目指される中、何のためにそれをするのか
を考えたとき、Python講座参加者への貢献、aliceさんの職場の皆様に
感謝される内容を意識されていれば、すべてが正解かなと思います。
動画はレベル高すぎで、やり取り眺めているだけですが、とても刺激に
なります。
どうもありがとうございます。
aliceさんのコメント
(コメントID: 7879)
いつもコメントくださりありがとうございます!
>まずは「10日前より前のファイルだったらコピー」を思いつき、それを実現したaliceさんの勝ちだと思います。
田中さんにそのように言っていただけて嬉しいです(❁´◡`❁)
あたたかいお言葉をありがとうございます。
>ここから先、技術的な高みを目指される中、何のためにそれをするのかを考えたとき、Python講座参加者への貢献、aliceさんの職場の皆様に感謝される内容を意識されていれば、すべてが正解かなと思います。
何のためにやっているのか…、実はよくわかっていないのです。
(そもそも何ができるかもよくわかっていません。)
今はPythonはなんでもできる魔法のように感じていて、1つずつ使えるようになっていくのが楽しくて、試しながら使っています(●'◡'●)
何かPythonでお役に立てることができたら良いのですが、今は思いつかないうえに、そもそもそんな実力もないので、楽しみながら学んでいきたいと思います。
ゆくゆくは貢献できるように一歩一歩進んでいきたいです。
田中さんの前向きな姿勢には、いつもハッとさせられています。
こちらこそありがとうございます。
小川 慶一さんのコメント
(コメントID: 7880)
そうは言ってもたぶんされていることと思いますが、何度も同じ操作を試してみてください。
> acliceさん
>> 今はPythonはなんでもできる魔法のように感じていて、1つずつ使えるようになっていくのが楽しくて、試しながら使っています(●'◡'●)
エクセルVBAとは比べ物にならないですよね。
ひきつづき、お楽しみください☆
aliceさんのコメント
(コメントID: 7883)
ありがとうございます。
楽しみながら続けていきたいと思いますー。
お大事になさってください(●'◡'●)