gpt4 book ai didi

python - 文件扩展名 Python

转载 作者:太空狗 更新时间:2023-10-30 01:33:06 25 4
gpt4 key购买 nike

如果目录同时包含“.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 文件,他将编写 *.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"

我的'm'函数(一小部分)

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()

一个更好的选择是使用一个通用函数,它接受一个文件扩展名并且只是迭代传递给扩展名的参数:

def main(argv):
args = argumentParser(argv)
for ext in args:
generic_search(ext)

如果您试图匹配两者,则无法在字符串上使用 args.dirname.endswith(('.m', '.xml')),该字符串根本无法匹配以 .m.xml 结尾。我还将路径作为一个 arg,将要搜索的扩展作为单独的 arg,然后您可以将每个单独的 glob 或使用 str.endswith 和多个扩展,使用 os.listdir 列出文件。

基本思路是这样的:

from argparse import ArgumentParser
import os

parser = ArgumentParser()
parser.add_argument("path")
parser.add_argument('ext', nargs='*')

args = parser.parse_args()
path = args.path
exts = args.ext

# what your glob is doing
for 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 ArgumentParser
import os
from glob import iglob

parser = ArgumentParser()
parser.add_argument("path")
parser.add_argument('ext', nargs='*')

args = parser.parse_args()
path = args.path
exts = args.ext

for 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 适用于单个匹配项或多个匹配项,但如果您有多个扩展名,那么将 listdir 和 filer 与 endswith 一起使用会更有意义。

如果你真的想为每个扩展使用不同的逻辑,你可以拉出扩展并使用字典调用适当的函数映射扩展名到函数:

from argparse import ArgumentParser
import os
from glob import iglob

def 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.path
exts = args.ext


for 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)

字典查找是 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36180014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com