python script.py --dir C:\path\path\*.* #This should take all files (doesn't matter what type ex 'm','xml' 'txt' etc.).
如果用户只想要xml文件,他会为’.m’文件写* .xml,反之亦然.请注意,如果用户只需要“XML”或“m”文件,脚本就会找到它
def main(argv): args = argumentParser(argv) if args.dirname.endswith('.m'): overrIDeM(args) elif args.dirname.endswith('.xml'): xmloverrIDe(args) elif args.dirname.endswith(('.m','.xml')): #Can I do like this? #Here I want to run both of my function. overrIDeM() xmloverrIDe() else: print "Error can't find files"
我的”功能(小部分)
def overrIDeM(args): for filename in glob.glob(args.dirname): print filename with open(filename,'r') as searchfile: my_files_content = searchfile.read() #...rest of my code
我的’XML’功能(它的一小部分)
def xmloverrIDe(args): for filename in glob.glob(args.dirname): print filename with open(filename,'r') as searchfile: my_files_content = searchfile.read() #...rest of my code解决方法 elif args.dirname.endswith((‘.m’,’.xml’))无法工作,如果args是一个必须的字符串,或者你的代码会出错,那么它就不可能有两个不同的扩展名,你会如果用户想要同时选择两者,则需要获得扩展元组,例如:
def main(argv): # make argumentParser return a tuple args = argumentParser(argv) if sorted(args) == ('.m','.xml'): overrIDeM() xmloverrIDe()
一个更好的选择是使用一个泛型函数,它接受一个文件扩展名,只是迭代传入扩展名的args:
def main(argv): args = argumentParser(argv) for ext in args: generic_search(ext)
如果你试图匹配两者,你就无法在字符串上使用args.dirname.endswith((‘.m’,’.xml’)),字符串根本不能以.m和.xml结尾.我还将路径作为一个arg和扩展来搜索单独的args,然后你可以单独地为每个arbase,或者使用带有多个扩展的str.endswith,使用os.Listdir列出文件.
基本的想法是这样的:
from argparse import ArgumentParserimport osparser = ArgumentParser()parser.add_argument("path")parser.add_argument('ext',nargs='*')args = parser.parse_args()path = args.pathexts = args.ext# what your glob is doingfor f in os.Listdir(path): if f.endswith(tuple(exts)): with open(os.path.join(path,f)) as fle: print(fle.name) # do whatever
如果您允许用户搜索多个文件,那么除非您在每个函数中执行非常具体的 *** 作,否则最好使用endswith并对目录进行一次传递.
如果您还想搜索所有子目录以及路径,也可以将它与glob结合使用:
from argparse import ArgumentParserimport osfrom glob import iglobparser = ArgumentParser()parser.add_argument("path")parser.add_argument('ext',nargs='*')args = parser.parse_args()path = args.pathexts = args.extfor f in chain.from_iterable([iglob(path+"/*"),iglob(path+"/**/*")]): if f.endswith(tuple(exts)): with open(os.path.join(path,f)) as fle: print(fle.name)
再次,它将适用于多个文件扩展名,一次通过目录. glob适用于单个匹配或者可能是一对,但如果你有多个扩展,那么使用带有endswith的Listdir和filer会更有意义.
如果你真的想为每个扩展使用不同的逻辑,你可以拉伸扩展并使用dict调用相应的函数映射扩展名到函数:
from argparse import ArgumentParserimport osfrom glob import iglobdef xml(f): print(f)def m(f): print(f)def text(f): print(f)mapped = {"m":m,"xml":xml,"text":text}parser = ArgumentParser()parser.add_argument("path")parser.add_argument('ext',nargs='*')args = parser.parse_args()path = args.pathexts = args.extfor f in chain.from_iterable([iglob(path + "/*"),iglob(path + "/**/*")]): ext = f.rsplit(".",1) if len(ext) == 2 and ext[1] in mapped: mapped[ext[1]](f)
dict查找是O(1),因此除了简洁之外,它也非常有效.
样本输出:
$python 3_payg.py /home/padraic .xml /home/padraic/sitemap.xml/home/padraic/yacy/build.xml/home/padraic/graphviz-master/graphviz.appdata.xml总结
以上是内存溢出为你收集整理的文件扩展名Python全部内容,希望文章能够帮你解决文件扩展名Python所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)