2017-04-20 46 views
2

如果想要獲取具有特定模式名稱的所有文件的(絕對)文件路徑(文件列表),如何在Python中完成此操作(在unix上爲v 3.5)。類似於bash命令find -regex 'pattern'。我一直在尋找osglob,os.path和這個SO,但不能把它放在一起。Python:以遞歸方式使用正則表達式模式獲取文件的路徑名

假設你想匹配/.*[pat.txt]$/該文件的絕對路徑,你有以下diretories:

/home/me/dir1/dir1a/filepat.txt #1 
/home/me/dir1/dir1a/file.txt 
/home/me/dir1/dir1a/filepat.png 
/home/me/dir2/filepat.txt #2 
/home/me/dir3/dir3a/dir3ab/filepat 
/home/me/dir3/dir3a/dir3ac/filepat.txt #3 
/home/me/dir3/dir3a/dir3ac/filepat.png 

然後你會得到想要三條所示的路徑:

/home/me/dir1/dir1a/filepat.txt 
/home/me/dir2/filepat.txt 
/home/me/dir3/dir3a/dir3ac/filepat.txt 

一個嘗試是:

import fnmatch 
import os 
start_path = "/home/me/" 
for root, dirs, files in os.walk(start_path): 
    for filename in fnmatch.filter(files, ".*pat.txt"): 
     print(os.path.join(start_path, filename)) 
+1

Python,在文章標題拼錯:-) – 2017-04-20 06:26:54

+0

尷尬 - 但很好趕上 – user3375672

+0

不用擔心,我在「調試模式」;-) – 2017-04-20 07:10:39

回答

1

您可以使用basenamein操作

x = given list 
>>> [i for i in x if 'pat.txt' in os.path.basename(i)] 
['/home/me/dir1/dir1a/filepat.txt', 
'/home/me/dir2/filepat.txt', 
'/home/me/dir3/dir3a/dir3ac/filepat.txt'] 
+0

哦,我完全錯過了'basename' – user3375672

+1

但是,這個解決方案也會提取'filepat.txt.bak'這樣的文件 –

+0

爲了解決這個問題,只需要使用'decendswith('pat.txt')' –

1

下面是一個使用正則表達式,但對於簡單的情況下,我會去akash`s使用答案運營商in

import re 
pattern = re.compile(r'.*pat\.txt$') 

import fnmatch 
import os 
start_path = "/home/me/" 
for root, dirs, files in os.walk(start_path): 
    for filename in files: 
     if pattern.find(filename): 
      print(os.path.join(start_path, filename)) 
+0

我很近,我明白了。 (+1)我認爲你很一般, – user3375672

相關問題