質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

3204閲覧

Python パスを「ファイル名」でソート

masa0929

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/05/12 09:52

こんにちは。
pythonコードについて、どなたかいいやり方、アイデアお持ちの方、ぜひご教示ください。

■質問
globで取得したファイルリストの並び替えについて、下記のような配置でファイルが存在するときに
ファイルリストをDIR含んだパス名ではなく「ファイル名」でソートしたいのですがどのようなやり方があるでしょうか

◇環境:python 2.7.14

◇ファイルの置き場所例
root/A/file1.txt
root/A/file2.txt
root/A/file3.txt
root/B/file1.txt
root/B/file2.txt
root/B/file3.txt
root/C/file1.txt
root/C/file2.txt
root/C/file3.txt

◇試してみたコード

import glob filepath = 'root' filelist = glob.glob(filepath + '/**/file*.txt') sorted_list = sorted(filelist) for l in sorted_list: print(l)

◇結果:パス名でソートされてしまう
root/A/file1.txt
root/A/file2.txt
root/A/file3.txt
root/B/file1.txt
root/B/file2.txt
root/B/file3.txt
root/C/file1.txt
root/C/file2.txt
root/C/file3.txt

◇欲しい結果:ファイル名でソートしたい
root/A/file1.txt *
root/B/file1.txt *
root/C/file1.txt *
root/A/file2.txt * *
root/B/file2.txt * *
root/C/file2.txt * *
root/A/file3.txt * * *
root/B/file3.txt * * *
root/C/file3.txt * * *
※ファイル名が同じ場合には、*, **, ***内の表示順は問いません
(もちろん一つ上のDIR名(この場合はA,B,C)の順にソートされるとキレイですがそこまでは求めていません(コードも複雑になりそうなので・・))

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

すでに回答付いているのでいいのですが、pathlibを使うとちょっとだけ楽なので。

python

1filepath = 'root' 2filelist = pathlib.Path(filepath).glob('**/file*.txt') 3sorted_filelist = sorted(filelist, key=lambda x: x.stem)

pathlibのPathのインスタンスはstemという属性でファイル名の部分を返すのでそれをキーにしてソートできます。

pathlibは他にもファイルや名前(パス)を扱うのに便利な機能が沢山あるので便利です。

投稿2022/05/12 10:39

TakaiY

総合スコア12666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa0929

2022/05/12 10:52

ありがとうございます!! こんなモジュールもあるのですね、勉強になります >pathlibは他にもファイルや名前(パス)を扱うのに便利な機能が沢山あるので便利です 確かに便利そうですね。 ちなみに >filelist = pathlib.Path(filepath).glob('**/file*.txt') とサンプル教えていただきましたが、Path( )のなかは、パスの一部でも良いものなのでしょうか? (この場合、'root'部分だけしかPath( )に入っていないが、取得されたfilelist全体に、Pathlib.Pathの恩恵は届く?? イメージとしてパス全体を引数に渡さないといけないように思ったのですが。。) →この辺もいろいろ試して使えるようになろうと思います
TakaiY

2022/05/13 01:31 編集

パスには絶対パスと相対パスという考えかたがあって、linuxなどであれば、 ・ 「/」で始まっていれば絶対パス ・ そうでなければ相対パス です。 絶対パスは、ルートディレクトリからのパスなのでどこで指定しても同じですが、相対パスは「プログラムを起動した場所」から見たパスです。 root とだけ指定した場合、それは相対パスなので、起動した場所にあるrootディレクトリが指定されることになります。 ちなみに、pathlibのglobで取得したパスは、すべて絶対パスになります。
masa0929

2022/05/12 23:45

TakaiYさま 丁寧なフォローアップありがとうございました!
guest

0

ソート HOW TO — Python 3.10.4 ドキュメント

sorted 関数のkeyに、ファイル名を返す関数を指定すればいいです

投稿2022/05/12 10:27

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa0929

2022/05/12 10:33

ありがとうございます!! リンク先にいろいろ応用の効く記述例が書かれていますね。 勉強になります。こちらも読んで理解深めます
y_waiwai

2022/05/12 10:44

他の回答と同じこと言ってるわけですが、 まあ、あなたの理解できる範囲でいろいろ試してみるといいかと。
guest

0

ベストアンサー

python

1#sorted_list = sorted(filelist) 2sorted_list = sorted(filelist, key=lambda p: p.split('/')[-1])

投稿2022/05/12 09:58

melian

総合スコア19618

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

masa0929

2022/05/12 10:30

ありがとうございます!! key, lambdaというのが良くわからなかったのですが、Webで調べて何となくわかりました! (この場合は自分でソートルールを関数(?)として作れるんですね) p.split('/')[-1] というのがまだよく理解できていませんが、そこも勉強してみます!
masa0929

2022/05/12 23:49

melianさま 教えていただいた記述をベースとしてやりたいことができることが確認できました! 迅速かつシンプルな手法について教えていただきありがとうございます。 こちらベストアンサーとさせてください 皆さま> とても勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問