web-dev-qa-db-ja.com

pythonを使用して特定の順序でファイル名を並べ替える方法

Pythonのディレクトリでファイルを並べ替える簡単な方法はありますか?私が考えているファイルは、

file_01_001
file_01_005
...
file_02_002
file_02_006
...
file_03_003
file_03_007
...
file_04_004
file_04_008

私が欲しいのは

file_01_001
file_02_002
file_03_003
file_04_004
file_01_005
file_02_006
...

現在、次のようにディレクトリにglobを使用してそれらを開いています。

for filename in glob(path):    
    with open(filename,'rb') as thefile:
        #Do stuff to each file

したがって、プログラムが目的のタスクを実行している間、ファイルの順序が原因で、一度に複数のファイルを実行すると、誤ったデータが提供されます。何か案は?

8
Lou

前述のように、ディレクトリ内のファイルは特定の方法で本質的にソートされていません。したがって、通常、1)ファイル名を取得します。2)ファイル名を目的のプロパティでソートします。3)ファイルをソート順に処理します。

次のようにして、ディレクトリ内のファイル名を取得できます。ディレクトリが「〜/ home」であるとします

import os

file_list = os.listdir("~/home")

ファイル名を並べ替えるには:

#grab last 4 characters of the file name:
def last_4chars(x):
    return(x[-4:])

sorted(file_list, key = last_4chars)   

したがって、次のようになります。

In [4]: sorted(file_list, key = last_4chars)
Out[4]:
['file_01_001',
 'file_02_002',
 'file_03_003',
 'file_04_004',
 'file_01_005',
 'file_02_006',
 'file_03_007',
 'file_04_008']

それらをソート順に読み込んで処理するには、次のようにします。

file_list = os.listdir("~/home")

for filename in sorted(file_list, key = last_4chars):    
    with open(filename,'rb') as thefile:
        #Do stuff to each file
11
Gene Burinsky

より良い解決策は、Tclの「lsort -dictionary」を使用することです。

from tkinter import Tcl
Tcl().call('lsort', '-dict', file_list)

Tcl辞書の並べ替えは数値を正しく処理し、ファイルマネージャーがファイルの並べ替えに使用するものと同様の結果を取得します。

2