文件扩展名Python

文件扩展名Python,第1张

概述如果一个目录同时包含’.m’和’.xml’文件,我希望脚本同时找到它们(目前它不会这样做,而是转到’else’语句).给定的参数应该查找目录中的所有文件. python script.py --dir C:\\path\\path\\*.* #This should take all files (doesn't matter what type ex 'm', 'xml' 'txt' etc.) 如果一个目录同时包含’.m’和’.xml’文件,我希望脚本同时找到它们(目前它不会这样做,而是转到’else’语句).给定的参数应该查找目录中的所有文件.

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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197570.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存