Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python parse_args从解析器参数获取所有.png文件_Python_Windows_Python 3.x_Argparse_Glob - Fatal编程技术网

Python parse_args从解析器参数获取所有.png文件

Python parse_args从解析器参数获取所有.png文件,python,windows,python-3.x,argparse,glob,Python,Windows,Python 3.x,Argparse,Glob,在运行以下(test.py)之后,我想得到一个arg.pics,它返回类似['pic1.png','pic2.png','pic3.png'](任意解析.png格式的所有文件): 通过命令行运行脚本并输入 python test.py -p ../User/Desktop/Data/*.png 然后args.pics返回['../User/Desktop/Data/*.png'] 我是否使用了正确的方法?我听说使用*.png将在输入后扩展为.png文件,但我这边的情况似乎不是这样 编辑:如果有

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

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

python test.py -p ../User/Desktop/Data/*.png
然后
args.pics
返回
['../User/Desktop/Data/*.png']

我是否使用了正确的方法?我听说使用
*.png
将在输入后扩展为.png文件,但我这边的情况似乎不是这样


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

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


默认情况下,Anaconda命令提示符使用
cmd.exe
,不支持通配符扩展。您可以改为使用,它可以理解通配符。或者,您可以按照Mad Physicast的说明在应用程序中进行扩展。

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


默认情况下,Anaconda命令提示符使用
cmd.exe
,不支持通配符扩展。您可以改为使用,它可以理解通配符。或者,您可以在应用程序中进行Mad Physicast’s中描述的扩展。

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

因为您要查找文件夹中所有PNG的列表,所以根本不需要依赖shell。在Python中有很多方法可以做同样的事情,包括集成和不集成

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

  • 使用(推荐选项)。这可以递归到子目录,也可以不递归到子目录,具体取决于您想要的内容:

    mydir = '../User/Desktop/Data/'
    pngs = glob.glob(os.path.join(mydir, '*.png'))
    
    要递归到子文件夹中,只需添加
    recursive=True
    关键字only选项

  • 使用。这更加灵活(因此需要更多的工作),但也允许您使用递归或非递归解决方案:

    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[:]
    ,这将抑制子目录搜索

  • 始终是非递归的相关方法是使用Pythons rough,相当于
    ls
    dir
    命令:

    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))
    
  • 使用参数直接集成到
    argparse

    parser.add_argument("-p", "--pics", action='store', type=list_pngs, help="picture files", required=True)
    
    现在可以直接使用参数,因为它将直接转换为列表:

    print(args.pics)
    

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

    因为您要查找文件夹中所有PNG的列表,所以根本不需要依赖shell。在Python中有很多方法可以做同样的事情,包括集成和不集成

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

  • 使用(推荐选项)。这可以递归到子目录,也可以不递归到子目录,具体取决于您想要的内容:

    mydir = '../User/Desktop/Data/'
    pngs = glob.glob(os.path.join(mydir, '*.png'))
    
    要递归到子文件夹中,只需添加
    recursive=True
    关键字only选项

  • 使用。这更加灵活(因此需要更多的工作),但也允许您使用递归或非递归解决方案:

    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[:]
    ,这将抑制子目录搜索

  • 始终是非递归的相关方法是使用Pythons rough,相当于
    ls
    dir
    命令:

    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))
    
  • 直接融入