Python Tips 複数のファイルのパス名を読み込んで自然順に並べる方法
Pythonでプログラミングをしよ。えーっと、特定のフォルダ内のファイルを読み込んで、ファイル一覧を表示してっと。。。
ファイル一覧を表示する際に、表示順序を「自然順」にすると見やすいですよ。
そもそも「自然順」って何ですか?ついでに、「自然順」に表示する方法も教えて下さい!
色々と欲張りですね。。。では、表示順序の違いと「自然順」に表示する具体的な方法を紹介しましょう。
この記事では,プログラミング言語のPythonを使って,複数のファイルのパスを取得して.自然順に並べる方法について書きます.
プログラムで複数のファイルを読み込んで処理をする際に,ファイルの順番を意識する必要がある場合があります.
例えば,10枚の画像を読み込んでアニメーションを作成する際に,時系列に1〜10と画像をコマ送りしたいですよね.
そんな場合に便利なTipsをこの記事で紹介します.
1. Pythonを使って,複数のファイルのファイル名を取得する
まず,本記事で想定するファイルの一覧は下記の通りとなります.
./
├── data
│ ├── 1.txt
│ ├── 10.txt
│ ├── 11.txt
│ ├── 2.txt
│ ├── 20.txt
│ ├── 25.txt
│ └── 9.txt
└── main.py
カレントディレクトリには,「data」というディレクトリ(フォルダ)とPythonで記述したプログラムの「main.py」が.保存されています.
「main.py」で,「data」ディレクトリの中に保存されているファイルのファイル名を取得します.
ファイル名を取得する方法として,ここでは,「glob」というライブラリを使います.
まずは,サンプルプログラムを下記に示します.
1行目の「import glob」と記述することで,「glob」というライブラリを使うことができるようになります.
「glob」は標準ライブラリなので,pipコマンドでインストールせずとも使えます.
「glob.glob()」メソッドの引数で指定した条件のファイルのパス名を取得できます.
ここでは,「"data/*.txt"」と記述しており,dataディレクトリの中に保存されている拡張子が「.txt」のファイルのパス名を指します.
*(アスタリスク)は,ワイルドカードの一つで,任意の文字列を表します.
つまり,「data/」と「.txt」の間に任意の文字列が入るようなパスを対象とします.
例えば,「data/aaaa.txt」でも,「data/12345.txt」といったパスが当てはまります.
先程のプログラムを実行して,dataディレクトリの中身のファイルのパスの一覧を取得してみると,下記のように表示されます.
['data/10.txt', 'data/11.txt', 'data/9.txt', 'data/2.txt', 'data/1.txt', 'data/20.txt', 'data/25.txt']
順番はよくわかりませんが,dataディレクトリに保存されている全てのファイルのパスが取得できました.
なぜならば,dataディレクトリに保存されているファイルの拡張子は,全て「.txt」だからです.
ここで,ファイル名の条件を変更して「file = glob.glob("data/1*.txt")」として,再度プログラムを実行してみると,下記の結果となります.
['data/10.txt', 'data/11.txt', 'data/1.txt']
すると,頭に1がついたファイルしか表示されなくなりました.
このようにglobを使うことで,便利にファイルのパスの一覧を取得することができます.
2. Pythonを使って,読み込んだファイルの名前を自然順に並べる
次に,globで取得した一覧を,自然順に並び替えることをします.
大事なキーワードの「自然順」について説明します.
自然順とはなんぞやを説明するよりも,「辞書順」で並べたときとの対比によって,理解を深めてもらおうと思います.
例として,「1.txt, 11.txt, 2.txt, 10.txt」というファイル名の一覧を並び替える場合を考えます.
辞書順の場合は,「1.txt, 10.txt, 11.txt, 2.txt」となります.
自然順の場合は,「1.txt, 2.txt, 10.txt, 11.txt」となります.
冒頭で少し話した,複数の画像ファイルを読み込んでアニメーションにする場合等は,バラバラのファイルを連番で名前を付けておき,自然順で並べた上で画像を処理することで,時系列でのアニメーションを作ることができます.
自然順にファイルのパスの一覧を並べる方法として,ここでは,「natsort」というライブラリを使います.
「natsort」を使ったサンプルプログラムを下記に示します.
「from natsort import natsorted」と記述することで,「natsort」の「natsorted」のメソッドを使えるようになります.
また,globで取得したdataディレクトリの中に保存されているファイルのパスの一覧を格納したfile_0を引数として,「file = natsorted(file_0)」と記述することで,自然順に並べた一覧がfileに格納できます.
サンプルプログラムの実行結果を,下記に示します.
['data/1.txt', 'data/2.txt', 'data/9.txt', 'data/10.txt', 'data/11.txt', 'data/20.txt', 'data/25.txt']
確かに自然順になっていることが確認できます.
コメント
コメントを投稿