Python glob,os,相对路径,将文件名放入列表

时间:2017-07-09 08:48:32

标签: python linux macos

我正在尝试列出目录中所有文件的列表,文件名在.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'部分。如果我使用globe,我会遇到/ home / usr /的问题。如果我使用os.listdir,我就不能指定" .root" endling。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

只需使用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))