Pythonでやってみよ。ファイル操作
Pythonでファイル操作する例です。
必要なモジュールは、pathlib。ファイル操作時に文字列検索、置換や日付も扱うので、re、datetimeも使います。
ファイル操作する対象のディレクトリ(Windowsではフォルダ)の中にあるファイルをリストにします。ファイルのリストを使って、ディレクトリなしのファイル名だけを表示したり、ファイルの更新日時を表示したりできます。(他にもいろいろできることがあります)ファイルのリストをファイル名で並び替えたり、更新日時で並び替えたりします。ファイル名で検索したり、ファイルの内容から検索したりもできます、という例です。(青空文庫さんからダウンロードしたファイルを使っています)
pathlibについては、公式ドキュメントを軽く読むことをおすすめします。
(https://docs.python.org/ja/3/library/pathlib.html?highlight=pathlib#pathlib.Path.stat)
#必要なモジュールを読み込む。
>>> import re
>>> import datetime
>>> import pathlib
#ファイル操作をするディレクトリ配下のファイルをリストにして変数に代入。
>>> l1_=list(pathlib.Path('~/aozora').expanduser().glob('**/*'))
#変数の確認。ファイルがpathlib形式でリストになっている。
>>> l1_
[PosixPath('~/aozora/tsumito_batsu.txt'), PosixPath('~/aozora/nekono_jimusho.txt'), PosixPath('~/aozora/kaijin_nijumenso.txt'), PosixPath('~/aozora/alicewa_fushigino_kunide.txt'), PosixPath('~/aozora/hashire_merosu.txt')]
#pathlib形式のデータからファイル名(name)と更新日時(stat().st_mtime)で表示。
>>> [f'{x.name}:{x.stat().st_mtime}' for x in l1_]
['tsumito_batsu.txt:1713943850.184843', 'nekono_jimusho.txt:1713943823.1248612', 'kaijin_nijumenso.txt:1713943803.8408742', 'alicewa_fushigino_kunide.txt:1713943773.8848941', 'hashire_merosu.txt:1713943679.5849557']
#更新日時がタイムスタンプ形式なので、datetimeを使って読みやすくして表示。
>>> [f'{x.name}: [datetime.datetime.fromtimestamp(x.stat().st_mtime).astimezone().strftime("%Y-%m-%d %H:%M:%S")}' for x in l1_]
['tsumito_batsu.txt: 2024-04-24 16:30:50', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'hashire_merosu.txt: 2024-04-24 16:27:59']
#変数に代入。
>>> fls_=[f'{x.name}: {datetime.datetime.fromtimestamp(x.stat().st_mtime).astimezone().strftime("%Y-%m-%d %H:%M:%S")}' for x in l1_]
#sortedを使って、リストの中身を並び替えの例。更新日時で昇順で並び替え。
>>> sorted(fls_,key=lambda x:x.split(': ')[-1])
['hashire_merosu.txt: 2024-04-24 16:27:59', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'tsumito_batsu.txt: 2024-04-24 16:30:50']
>>> sorted(fls_,key=lambda x:x.split(': ')[-1],reverse=False)
['hashire_merosu.txt: 2024-04-24 16:27:59', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'tsumito_batsu.txt: 2024-04-24 16:30:50']
#sortedを使って、リストの中身を並び替えの例。更新日時で降順で並び替え。
>>> sorted(fls_,key=lambda x:x.split(': ')[-1],reverse=True)
['tsumito_batsu.txt: 2024-04-24 16:30:50', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'hashire_merosu.txt: 2024-04-24 16:27:59']
#sortedを使って、リストの中身を並び替えの例。ファイル名で昇順で並び替え。
>>> sorted(fls_,key=lambda x:x.split(': ')[0])
['alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'hashire_merosu.txt: 2024-04-24 16:27:59', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'tsumito_batsu.txt: 2024-04-24 16:30:50']
#sortedを使って、リストの中身を並び替えの例。ファイル名で降順で並び替え。
>>> sorted(fls_,key=lambda x:x.split(': ')[0],reverse=True)
['tsumito_batsu.txt: 2024-04-24 16:30:50', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'hashire_merosu.txt: 2024-04-24 16:27:59', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33']
#変数fls_(リスト)を表示。
>>> [x for x in fls_]
['tsumito_batsu.txt: 2024-04-24 16:30:50', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'hashire_merosu.txt: 2024-04-24 16:27:59']
#fls_から「ali」を含むものを検索して表示。
>>> [x for x in fls_ if re.search('ali',x)]
['alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33']
#fls_から「_」を含むものを検索して表示。
>>> [x for x in fls if re.search('',x)]
['tsumito_batsu.txt: 2024-04-24 16:30:50', 'nekono_jimusho.txt: 2024-04-24 16:30:23', 'kaijin_nijumenso.txt: 2024-04-24 16:30:03', 'alicewa_fushigino_kunide.txt: 2024-04-24 16:29:33', 'hashire_merosu.txt: 2024-04-24 16:27:59']
#変数l1(リスト)を表示。
>>> l1_
[PosixPath('~/aozora/tsumito_batsu.txt'), PosixPath('~/aozora/nekono_jimusho.txt'), PosixPath('~/aozora/kaijin_nijumenso.txt'), PosixPath('~/aozora/alicewa_fushigino_kunide.txt'), PosixPath('~/aozora/hashire_merosu.txt')]
#l1_から各ファイルの最初の20文字を表示。
>>> [x.read_text()[:20] for x in l1_]
['罪と罰\nフョードル・ミハイロヴィッチ・ド', '猫の事務所\n……ある小さな官衙に関する幻', '怪人二十面相\n江戸川乱歩\n\n------', 'アリスはふしぎの国で\nALICE IN ', '走れメロス\n太宰治\n\n---------']
#l1_から「猫」を含むファイルを表示。
>>> [x.name for x in l1_ if re.search('猫',x.read_text())]
['tsumito_batsu.txt', 'nekono_jimusho.txt', 'alicewa_fushigino_kunide.txt']
#l1_から「猫」を含むファイルのファイル名と「猫」の前後改行を含む部分を表示。re.searchは、マッチする部分が複数合っても、最初のパターンにのみマッチします。パターンすべて見つけたい場合は、re.findallを使います。他にも、re.finditerもパターン全てにマッチしますが、こちらは、re.Matchオブジェクトのリストとして取り出せます。見つかったテキスト部分のほか位置情報も取得できます。
>>> [x.name+'\n'+re.search('\n.*?猫.*?\n',x.read_text()).group() for x in l1_ if re.search('猫',x.read_text())]
['tsumito_batsu.txt\n\n\u3000もっとも、彼はそれほど臆病で、いじけ切っていたわけでなく、むしろその反対なくらいだった。が、いつのころからか、ヒポコンデリイに類したいら立たしい、張りつめた気分になっていた。すっかり自分というものの中に閉じこもり、すべての人から遠ざかっていた ので、下宿のおかみのみならず、いっさい人に会うのを恐れていたのである。彼は貧乏におしひしがれていた。けれども、この逼迫《ひっぱく》した状態すらも、このごろ彼はあまり苦にしなくなった。その日その日の当面の仕事も全然放擲してしまい、そんな事にかかずらう気にもならなかったのである。彼は正直なところ、どこのどのようなおかみがいかなる事を企てようと、けっして恐れなどしなかった。けれど、階段の上に立ち止まらされて、なんの役にも立たない平凡なごみごみした話や、うるさい払いの督促や、おどかしや、泣き言などを聞かされた上、自分の方でもごまかしたり、あやまったり、嘘をついたりするよりは――猫のように階段をすべりおりて、誰にも見られないように、ちょろりと姿をくらます方がまだしもなのであった。\n', 'nekono_jimusho.txt\n\n\u3000軽便鉄道の停車場のちかくに、猫の第六事務所がありました。ここは主に、猫の歴史と地理をしらべるところでした。\n', 'alicewa_fushigino_kunide.txt\n\n「こっちの言葉がわからないのかも。」とアリスは考えごと。「たぶん外国ネズミなのね、ウィリアムせいふく王についてわたってきた。」(その子の知ってるかぎりでは、何年前に何が起こったのかはうろ覚えだから、こんなことに。)で、またやってみる。「吾猫兮何在《わがねこいずくにかある》?」これは外国語のドリルにある初めの文。ネズミは水からいきなりとび出し、そりゃもうびくびくとふるえだしてね。「あら、ごめんあそばせ!」あわてて声を上げるアリス、このあわれな動物の気をそこねたかと気がかりで。「ネコお好きでないことうっかりしててよ!」\n']
#上の結果のリストからファイル名の前に「=====(改行)」をつけてテキスト表示。
>>> print('\n'.join(['=====\n'+x.name+'\n'+re.search('\n.*?猫.*?\n',x.read_text()).group() for x in l1_ if re.search('猫',x.read_text())]))
tsumito_batsu.txt
もっとも、彼はそれほど臆病で、いじけ切っていたわけでなく、むしろその反対なくらいだった。が、いつのころからか、ヒポコンデリイに類したいら立たしい、張りつめた気分になっていた。すっかり自分というものの中に閉じこもり、すべての人から遠ざかっていたので、下宿のおかみのみならず、いっさい人に会うのを恐れていたのである。彼は貧乏におしひしがれていた。けれども、この逼迫《ひっぱく》した状態すらも、このごろ彼はあまり苦にしなくなった。その日その日の当面の仕事も全然放擲してしまい、そんな事にかかずらう気にもならなかったのである。彼は正直なところ、どこのどのようなおかみがいかなる事を企てようと、けっして恐れなどしなかった。けれど、階段の上に立ち止まらされて、なんの役にも立たない平凡なごみごみした話や、うるさい払いの督促や、おどかしや、泣き言などを聞かされた上、自分の方でもごまかしたり、あやまったり、嘘をついたりするよりは――猫のように階段をすべりおりて、誰にも見られないように、ちょろりと姿をくらます方がまだしもなのであった。
=====
nekono_jimusho.txt
軽便鉄道の停車場のちかくに、猫の第六事務所がありました。ここは主に、猫の歴史と地理をしらべるところでした。
=====
alicewa_fushigino_kunide.txt
「こっちの言葉がわからないのかも。」とアリスは考えごと。「たぶん外国ネズミなのね、ウィリアムせいふく王についてわたってきた。」(その子の知ってるかぎりでは、何年前に何が起こったのかはうろ覚えだから、こんなことに。)で、またやってみる。「吾猫兮何在《わがねこいずくにかある》
#上のre.searchの例をre.findallとre.finditerに書き換えた例です。
#re.search版
>>> [x.name+'\n'+re.search('\n.*?猫.*?\n',x.read_text()).group() for x in l1_ if re.search('猫',x.read_text())]
#re.findall版
>>> [x.name+'\n'+'\n'.join(re.findall('\n.*?猫.*?\n',x.read_text())) for x in l1_ if re.search('猫',x.read_text())]
#re.finditer版
>>> [x.name+'\n'+'\n'.join([x.group() for x in re.finditer('\n.*?猫.*?\n',x.read_text())]) for x in l1_ if re.search('猫',x.read_text())])
例で使ったディレクトリaozaraの中には、青空文庫からダウンロードした次のファイルが入っています。
tsumito_batsu.txt
inekono_jimusho.txt
kaijin_nijumenso.txt
alicewa_fushigino_kunide.txt
hashire_merosu.txt
