我想将两个参数的功能合并为一个。目前-f可用于指定单个文件或通配符,-d可指定目录。我希望-f能够处理它当前的功能或目录。
以下是当前的选项陈述:
parser.add_option('-d', '--directory',
action='store', dest='directory',
default=None, help='specify directory')
parser.add_option('-f', '--file',
action='store', dest='filename',
default=None, help='specify file or wildcard')
if len(sys.argv) == 1:
parser.print_help()
sys.exit()
(options, args) = parser.parse_args()
这是功能中的逻辑,可以组合起来吗?
filenames_or_wildcards = []
# remove next line if you do not want allow to run the script without the -f -d
# option, but with arguments
filenames_or_wildcards = args # take all filenames passed in the command line
# if -f was specified add them (in current working directory)
if options.filename is not None:
filenames_or_wildcards.append(options.filename)
# if -d was specified or nothing at all add files from dir
if options.directory is not None:
filenames_or_wildcards.append( os.path.join(options.directory, "*") )
# Now expand all wildcards
# glob.glob transforms a filename or a wildcard in a list of all matches
# a non existing filename will be 'dropped'
all_files = []
for filename_or_wildcard in filenames_or_wildcards:
all_files.extend( glob.glob(filename_or_wildcard) )
答案 0 :(得分:1)
您可以将通配符,目录和文件列表传递给此函数。但是,如果不将它们放在命令行中的引号之间,shell将扩展通配符。
import os
import glob
def combine(arguments):
all_files = []
for arg in arguments:
if '*' in arg or '?' in arg:
# contains a wildcard character
all_files.extend(glob.glob(arg))
elif os.path.isdir(arg):
# is a dictionary
all_files.extend(glob.glob(os.path.join(arg, '*')))
elif os.path.exists(arg):
# is a file
all_files.append(arg)
else:
# invalid?
print '%s invalid' % arg
return all_files