使用全局递归搜索将文件路径提取为字符串?

extracting a filepath as a string using a global recursive search?

如果这是一个基本问题,我深表歉意,但我似乎找不到明确的解决方案。我正在使用全局递归搜索在目录及其子目录中查找具有特定扩展名的文件,如下所示:

我的代码

bam = list(Path('path/to/file').rglob("*.bam"))

这 returns 类似于:

[PosixPath('path/to/file/file.bam')]

但是,我只想提取文件路径,因此 bam 变量是一个仅包含文件路径的字符串,即

bam = 'path/to/file/file.bam'.

我意识到我可以将当​​前输出转换为字符串,然后使用正则表达式提取 ' ' 之间的所有内容,但我希望有更优雅的方法,甚至更简单的递归解决方案搜索不同扩展名的文件并将文件路径输出为字符串!

一如既往,我们将不胜感激!

您得到的输出是 PosixPaths 列表。

A PosixPath 是 Python pathlib 库的一部分。它是一个以“纯”形式存储您的路径的对象(因此您可以忽略诸如大写之类的东西并访问有用的路径特定方法)。根据您接下来要做的事情,保持这样可能更方便!

要解决您提出的问题,您需要访问列表中的第一个 PosixPath 并将其转换为字符串。但是请注意,如果目录中有多个具有该文件类型的文件,这只会为您提供第一个匹配项。

matches = list(Path('path/to/file').rglob("*.bam"))
bam = str(matches[0])

rglob return 一个生成器,它产生对作为 PurePath 子类的对象的引用。这些对象将通过 __str__() 的实现揭示实际路径名。因此:

from pathlib import Path

for p in Path('path/to/file').rglob('*.bam'):
    print(p)

...几乎肯定能满足您的需求。

请记住,print() 将隐式调用对象的 str() 函数(如果可用)。如果您需要将文件名放入列表中,则需要显式调用 str()。例如:

lop = [str(p) for p in Path('path/to/file').rglob('*.bam')]