【问题标题】:Python: get pathname of files using regex pattern recursivelyPython:使用正则表达式模式递归获取文件的路径名
【发布时间】:2017-04-20 06:21:45
【问题描述】:

如果想要获取具有特定模式名称的所有文件的(绝对)文件路径(文件列表),如何在 Python(unix 上的 v 3.5)中完成。类似于 bash 命令find -regex 'pattern' 的东西。我一直在寻找osglobos.path 和这个SO,但无法将它们放在一起。

假设您想要匹配 /.*[pat.txt]$/ 的文件的绝对路径,并且您有以下目录:

/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))

【问题讨论】:

  • Python 在帖子标题中拼写错误:-)
  • 尴尬 - 但很好
  • 别担心,我处于“调试模式”;-)

标签: python regex python-3.x filepath


【解决方案1】:

这是一个使用正则表达式的例子,但对于简单的情况,我会使用 akash 的答案,使用 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))

【讨论】:

  • 我看到了。我认为你的很笼统(+1)
【解决方案2】:

您可以使用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']

【讨论】:

  • 哦,我完全错过了basename
  • 然而,这个解决方案也会获取像filepat.txt.bak这样的文件
  • 要解决这个问题,只需使用i.endswith('pat.txt')
  • @WiktorStribiżew,如果需要,我们仍然可以使用endswith('pat.txt') 实现这一点:)
  • - 是的,但是它将无法获取FILEPAT.TXT。 - 我们可以使用lower()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多