Python Glob,OS,相对路径,使文件名成为列表

dif*_*ife 3 python linux macos

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

在论坛上阅读了一些著作之后,我尝试使用glob和os.listdir来制定基本策略,但是我俩都遇到了麻烦

首先,当我使用

import glob
filelist = glob.glob('/home/usr/dir/*.root')
Run Code Online (Sandbox Code Playgroud)

它的确列出了以.root结尾的所有文件名的字符串列表,但我仍然遇到问题。

我想成为文件名为'/ dir / .root'的字符串列表,但字符串具有完整路径'/ home / usr / dir / .root'

其次,如果我使用os.listdir,就会遇到麻烦

  path = '/home/usr/'
  filelist = os.listdir(path + 'dir/*.root')
  syntax error
Run Code Online (Sandbox Code Playgroud)

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

总而言之,我想列出一个以.root结尾并在/ home / usr / dir中的文件名列表,同时切断“ / home / usr”部分。如果使用globe,我会遇到拥有/ home / usr /的麻烦。如果使用os.listdir,则不能指定“ .root”结尾。

leo*_*leo 6

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', ...]
Run Code Online (Sandbox Code Playgroud)

...等等。

要获得唯一的文件名,你可以使用path.basename的的os模块,像这样的东西:

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', ...]
Run Code Online (Sandbox Code Playgroud)

...或者,如果您想添加dir零件:

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

...或者,如果您真的想在开始时使用路径分隔符:

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', ...]
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)


Ida*_*lom 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"))
Run Code Online (Sandbox Code Playgroud)

您还可以使用正则表达式

import re
files_names.append(re.sub(r'//home//usr//','', file, flags=re.I))
Run Code Online (Sandbox Code Playgroud)