【问题标题】:Python glob, os, relative path, making filenames into a list [duplicate]Python glob,os,相对路径,将文件名制作成列表[重复]
【发布时间】:2017-12-13 03:48:08
【问题描述】:

我正在尝试列出一个目录中所有文件的列表,文件名以 .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”结尾。

【问题讨论】:

  • 如果你希望文件路径是相对的,你必须首先决定相对于什么。到当前工作目录?到特定目录?
  • 我在这里留下了一个简单而简洁的相对 globbing 函数:stackoverflow.com/a/57514353/790075

标签: python linux macos


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 应避免使用此处建议的正则表达式,因为它不可移植。 (考虑“Windows 风格”的路径。)支持 Python 的路径操作功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2013-01-31
    • 1970-01-01
    • 2018-04-14
    • 2012-10-15
    相关资源
    最近更新 更多