2016-10-06 7 views
0

接尾辞とディレクトリパスを指定すると、指定した接尾辞で終わるディレクトリ内のファイルの完全なパスを抽出する必要があります。ディレクトリ内のファイルをフィルタリングしてディレクトリパスに参加する方法 - Python

現在、私はそのようにやっている:

import os 
dir_path = '/path/to/dir' 
suffix = '.xyz' 
filenames = filter(lambda x: x.endswith(suffix), os.listdir(dir_path)) 
filenames = map(lambda x: os.path.join(dir_path, x), filenames) 

私もglobでそれを行うことができます:

import glob 
dir_path = '/path/to/dir' 
suffix = '.xyz' 
glob.glob(dir_path+'*.'+suffix) 

私はPurePathを使用してサフィックスを確認することができpathlibもありますことを理解しますが私はその構文が何であるか分かりません。

ファイルへの完全なパスの同じフィルタリングされたリストを達成する他の方法はありますか?

答えて

2

あなたは一度に結果を構築するためにlist comprehensionを使用することができます。

>>> [os.path.join(os.sep, x, dir_path) for x in os.listdir(dir_path) 
if x.endswith(suffix)] 
['/home/msvalkon/foo.txt', 
'/home/msvalkon/output.txt', 
'/home/msvalkon/remaining_warnings.txt', 
'/home/msvalkon/test.txt', 
'/home/msvalkon/hdr_chksum_failure.txt'] 

dir_pathは常に絶対パスである場合、あなたはos.path.join()の代わりにos.path.abspath(x)を使用することができます。

大きなディレクトリの場合は、イテレータを返すos.scandirを使用することをお勧めします。これは方法がより速くなります。

>>> [entry.path for entry in os.scandir(dir_path) if entry.name.endswith(suffix)] 
['/home/msvalkon/foo.txt', 
    '/home/msvalkon/output.txt', 
    '/home/msvalkon/remaining_warnings.txt', 
    '/home/msvalkon/test.txt', 
    '/home/msvalkon/hdr_chksum_failure.txt'] 
+0

ディレクトリ内の1,000,000個のファイルを指定すると、 'filter' +' map'はリスト内包よりも速くなるか、またはその逆が成り立ちますか?または彼らは同じだろうか? – alvas

+0

'filter()'が1つのリストを作成し、 'map()'が別のリストを作成すると、リストの解説がより速くなると賭けるでしょう。そのような数で、発電機を使う方法を見つけることは賢明かもしれません。 – msvalkon

+0

実際には、リストを作成することはありません。フィルタとマップの両方がジェネレータを返します。 – alvas

関連する問題