Python glob、os、相对路径、将文件名转换为列表

10

我正在尝试列出一个目录中所有以 .root 结尾的文件名列表。

在阅读了论坛中的一些文章后,我尝试了使用 glob 和 os.listdir 两种基本策略,但两者都遇到了问题。

首先,当我使用

import glob
filelist = glob.glob('/home/usr/dir/*.root')

它确实创建了一个由所有以 .root 结尾的文件名组成的字符串列表,但我仍然面临一个问题。

我希望字符串列表中的文件名为“/dir/.root”,但该字符串具有完整路径“/home/usr/dir/.root”

其次,如果我使用 os.listdir,那么我会遇到麻烦,因为

  path = '/home/usr/'
  filelist = os.listdir(path + 'dir/*.root')
  syntax error

这告诉我,我不仅可以获取以 .root 结尾的文件列表。

总之,我想要列出以 .root 结尾并位于 /home/usr/dir 中的文件名列表,同时去掉 '/home/usr' 部分。如果我使用 glob,我会遇到 /home/usr/ 的问题。如果我使用 os.listdir,我无法指定以 ".root" 结尾。


如果你想让文件路径相对,你必须先决定相对于什么。是当前工作目录?还是特定的目录? - leo
我在这里留下了一个简单明了的函数,用于相对全局匹配:https://dev59.com/QWs05IYBdhLWcg3wR_63#57514353 - turtlemonvh
2个回答

19

glob将以匹配查询的格式返回路径,因此

glob.glob("/home/usr/dir/*.root")
# ['home/usr/dir/foo.root', 'home/usr/dir/bar.root', ...]

glob.glob("*.root")
# ['foo.root', 'bar.root', ...]

glob.glob("./*.root")
# ['./foo.root', './bar.root', ...]

等等,等等。

要仅获取文件名,您可以使用os模块的path.basename函数,类似于这样:

from glob import glob
from os import path

pattern = "/home/usr/dir/*.root"
files = [path.basename(x) for x in glob(pattern)]
# ['foo.root', 'bar.root', ...]

...或者,如果您想要在前面添加 dir 部分:

pattern = "/home/usr/dir/*.root"
files = [path.join('dir', path.basename(x)) for x in glob(pattern)]
# ['dir/foo.root', 'dir/bar.root', ...]

...或者,如果您真的希望路径分隔符在开头:

from glob import glob
import os

pattern = "/home/usr/dir/*.root"
files = [os.sep + os.path.join('dir', os.path.basename(x)) for x in glob(pattern)]
# ['/dir/foo.root', '/dir/bar.root', ...]

使用path.joinpath.sep可以确保根据您的操作系统使用正确的路径语法(即/\作为分隔符)。

根据您此处实际尝试做什么,您可能需要查看os.path.relpath,以获取相对路径。您的问题标题表明,相对路径可能是您实际需要的内容:

pattern = "/home/usr/dir/*.root"
files = [os.path.relpath(x) for x in glob(pattern)]
# files will now contain the relative path to each file, from the current working directory

6
只需使用glob来获取您想要的列表,然后在每个文件上使用os.path.relpath即可。
import glob
files_names = []
for file in glob.glob('/home/usr/dir/*.root'):
    files_names.append(os.path.relpath(file, "/home/usr"))

您也可以使用正则表达式

import re
files_names.append(re.sub(r'//home//usr//','', file, flags=re.I))

1
应避免使用此处建议的正则表达式,因为它不具备可移植性。(请考虑“Windows风格”的路径。)请优先使用Python的路径操作功能。 - bessbd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接