parse_args 来自解析器参数的所有 .png 文件

Posted

技术标签:

【中文标题】parse_args 来自解析器参数的所有 .png 文件【英文标题】:parse_args all .png files from a parser argument 【发布时间】:2019-02-24 20:35:47 【问题描述】:

我想得到一个arg.pics,它在运行以下(test.py)后返回类似['pic1.png', 'pic2.png', 'pic3.png'](任意解析所有.png格式的文件):

import argparse
import os

def parser_arg():
    par = argparse.ArgumentParser()
    parser = par.add_argument_group('pictures')
    parser.add_argument("-p", "--pics", nargs="+", help="picture files", required=True)
    arguments = par.parse_args()
    return arguments

args = parser_arg()

通过命令行运行脚本并输入

python test.py -p ../User/Desktop/Data/*.png

然后args.pics 改为返回['../User/Desktop/Data/*.png']..

我是否使用了正确的方法?我听说使用 *.png 会在输入后扩展为 .png 文件,但我的情况似乎并非如此。

编辑:如果有帮助,我将在 Windows 10 上使用 Anaconda Prompt。

【问题讨论】:

您在这里尝试做什么有点不清楚。 /path/to/folder/*.png 将被 shell 扩展成一个列表。另一方面,如果您只提供文件夹名称,Python 有一些自己获取 PNG 文件列表的好方法。您只是想要描述不同的可能性,还是有特定的想法? 同样重要的是,扩展将由 shell 仅在类 UNIX 操作系统而非 Windows 上完成。 你使用的是哪个外壳? @MadPhysicist 对于造成的混乱,我深表歉意。我想获取该文件夹中所有 .png 文件的列表,并在 Python 中使用 argparse。 @EugeneYarmash 如果有帮助,我正在使用 Anaconda 【参考方案1】:

有几件事可能会发生。一种可能性是../User/Desktop/Data/*.png 不匹配任何文件,因此不会被扩展。这只会发生在类似 UNIX 的 shell(或者我想是 PowerShell)上。另一种可能性是您在 Windows 上使用 cmd.exe,它根本不进行通配符扩展。鉴于您在 Windows 上使用 Anaconda 提示符,我倾向于后一种可能性作为解释。

由于您要查找文件夹中所有 PNG 的列表,因此您根本不需要依赖 shell。在 Python 中有很多方法可以做同样的事情,无论是否集成 argparse

让我们从实现列表功能开始。给定一个目录,这里有一些方法可以获取其中所有 PNG 的列表:

    使用glob.glob推荐选项)。这可以递归到子目录,也可以不递归,这取决于你想要什么:

    mydir = '../User/Desktop/Data/'
    pngs = glob.glob(os.path.join(mydir, '*.png'))
    

    要递归到子文件夹,只需添加 recursive=True 仅限关键字选项。

    使用os.walk。这更加灵活(因此需要更多的工作),但也让您有递归或非递归的解决方案:

    mydir = '../User/Desktop/Data/'
    pngs = []
    for path, dirs, files in os.walk(mydir):
        pngs.extend(f for f in files if f.lower().endswith('.png'))
        del dirs[:]
    

    要启用递归,只需删除行del dirs[:],它会禁止子目录搜索。

    一个总是非递归的相关方法是使用os.listdir,这在Pythons中大致相当于lsdir命令:

    mydir = '../User/Desktop/Data/'
    pngs = [f for f in os.listdir(mydir) if f.lower().endswith('.png')]
    

    这个版本不检查某些东西是否真的是一个文件。它假定您没有以 .png 结尾的文件夹名称。

假设您选择了其中一种方法并创建了一个接受文件夹并返回文件列表的函数:

def list_pngs(directory):
    return glob.glob(os.path.join(directory, '*.png'))

现在您知道如何列出文件夹中的文件,您可以轻松地将其插入到任何级别的argparse。以下是几个例子:

    只需从参数中获取所有目录,然后将它们列出:

    parser.add_argument("-p", "--pics", action='store', help="picture files", required=True)
    

    处理完参数后:

    print(list_pngs(args.pics))
    

    使用type 参数直接集成到argparse

    parser.add_argument("-p", "--pics", action='store', type=list_pngs, help="picture files", required=True)
    

    现在你可以直接使用参数了,因为它会直接转换成一个列表:

    print(args.pics)
    

【讨论】:

感谢您提供如此详细的细分!我尝试了您的建议,并且在 Anaconda 提示符下运行良好! :)【参考方案2】:

你的方法是正确的。但是,如果您的 shell 支持 globbing 并且模式实际上匹配任何文件,您的脚本将仅接收扩展的文件列表作为参数。否则,在大多数情况下,它将是模式本身。

Anaconda 命令提示符默认使用cmd.exe,不支持通配符扩展。您可以改用PowerShell,它可以理解通配符。或者,您可以按照 Mad Physicist 的 answer 中所述在您的应用程序中进行扩展。

【讨论】:

我尝试了上述方法,但它确实显示了我希望查看的文件夹中的所有 .png 文件。这可能是由于我使用的 shell 造成的吗? (我正在使用 Anaconda) @Stoner。 Anaconda 不是你的 shell,除非你在 Windows 上。你的操作系统是什么?您是否偶然使用了 cmd.exe?请将该信息编辑到您的问题中。 @MadPhysicist 我在 Windows 上使用 Anaconda Prompt。我对这些技术术语有些陌生,所以如果我对此有点迷茫,请原谅我。谢谢,我会相应地更新问题。

以上是关于parse_args 来自解析器参数的所有 .png 文件的主要内容,如果未能解决你的问题,请参考以下文章

python-argparse.ArgumentParser()用法解析

argparse详细使用手册

argparse详细使用手册

argparse详细使用手册

python 学习 argparse

python argparse详解