1

我目前正在研究 argparse 模块,我希望我的程序表现得像这样:

$ python cldir.py # this should delete all .meta files in ~/downloads 

$ python cldir.py -d /path/name/ # delete all .meta files in /path/name

$ python cldir.py -d /path/name -e txt # should delete all .txt files in /path/name

现在,我知道我需要为文件扩展名使用另一个参数(在本例中为 -e),但我想知道如何使 -d 开关的行为如上所示。

到目前为止,这是我的代码:

#!/usr/bin/env python

import argparse
import os
import glob

version = "0.1.1"

parser = argparse.ArgumentParser(
    description = 'cldir: clear a directory from .meta and other unwanted files')

# arguments list

parser.add_argument('-v', '--version', action='version', version = version)

parser.add_argument('-d', '--direct', action = 'store_true')

args = parser.parse_args()

if args.direct == False:
    path = os.environ['HOME'] + '/downloads/'
    files = glob.glob(path + '*.meta')

    if len(files) == 0:
        print('No .meta files found in ~/downloads')
    else:
        for f in files:
            os.remove(f)
    print('%d file(s) deleted' %len(files))

else:
    print(args.direct)

else: print(args.direct) 仅用于测试,直到我实现所需的行为。

任何其他观察/建议也非常受欢迎,因为我是 python 新手。

4

3 回答 3

1

使用两个可选参数可以让您的用户以任一顺序指定目录和扩展名,或者指定一个,让另一个作为默认值:

p.add_argument('-d','--dir',default='default_dir')
p.add_argument('-e','--ext',default='meta')

Input: '' produces: Namespace(dir='default_dir', ext='meta')
'-d otherdir' => Namespace(dir='otherdir', ext='meta')
'-d otherdir -e txt' => Namespace(dir='otherdir', ext='txt')
'-e txt' => Namespace(dir='default_dir', ext='txt')

阻止使用-ebefore 或 without-d是可能的,但可能不值得额外的代码。然而,这是位置的默认行为。

或者这两个论点可能是“?” 立场的

p.add_argument('dir',default='default_dir',nargs='?')
p.add_argument('ext',default='meta',nargs='?')

产生相同命名空间的输入将是'', 'otherdir', 'otherdir txt'. 在这种情况下,指定ext取决于指定dir

我认为store_true -d论点不会为定义增加任何内容。

于 2013-08-29T21:36:24.530 回答
1

-d使用默认值创建一个简单的“存储”参数。

parser.add_argument('--direct', '-d', default=os.environ['HOME'] + '/downloads/')

然后args.direct用作传递给的路径glob.glob

于 2013-08-29T14:50:53.073 回答
1

用于-d让用户提供路径。您可以使用参数设置默认路径default-e同样,您可以将选项的默认值设置为'meta'

import argparse
import os
import glob

version = "0.1.1"

parser = argparse.ArgumentParser(
    description = 'cldir: clear a directory from .meta and other unwanted files')

# arguments list

parser.add_argument('-v', '--version', action='version', version = version)

parser.add_argument('-d', '--directory', default=os.path.expanduser('~/downloads'),
                    help='directory to be cleaned')

parser.add_argument('-e', default='meta', help='extension')

args = parser.parse_args()
print(args)
path = os.path.join(args.directory)
files = glob.glob(path + '*.{}'.format(args.e))

if len(files) == 0:
    print('No .meta files found in ~/downloads')
else:
    for f in files:
        os.remove(f)
    print('%d file(s) deleted' %len(files))
于 2013-08-29T14:55:15.490 回答