为什么找不到具有py扩展名的文件?

时间:2019-08-17 00:27:59

标签: python

以下代码可以找到具有特定文件扩展名的文件。但是相同的代码无法找到具有py扩展名的文件。是什么原因呢?

search.py​​

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os


def search(dir_or_file):
    if dir_or_file.startswith("*."):
        return [
            os.path.join(i, m) 
            for i, j, k in os.walk("/")
            for m in k
            if m.endswith("." + dir_or_file.split(".")[1])
        ]        
    else:
        return [
            os.path.join(i, dir_or_file) 
            for i, j, k in os.walk("/") 
            if dir_or_file in k or dir_or_file in j
        ]


if __name__ == "__main__":
    import sys
    if len(sys.argv) == 2:
        for i in search(sys.argv[1]):
            print(i)

当我运行search.py脚本来搜索扩展名为*.txt的文件时,我得到以下输出:

tanberk@kutlu:~$ ./search.py *.txt
/media/tanberk/Data/Belgeler/İş Başvurusu/a.txt
/media/tanberk/Data/Projects/astrology/a.txt
/home/tanberk/a.txt
/home/tanberk/Projects/astrology/a.txt
tanberk@kutlu:~$ 

注意:顺便说一下,许多文件的扩展名为*.txt。该程序找不到全部。

当我运行search.py脚本来搜索扩展名为*.py的文件时,我得到以下输出:

tanberk@kutlu:~$ ./search.py *.py
tanberk@kutlu:~$ 

1 个答案:

答案 0 :(得分:2)

您的shell会在脚本看到之前扩展模式。您会找到所有a.txt个文件,因为*.txt从您的主目录扩展到了a.txt(而且您的主目录中显然没有其他.txt个文件),因此 real 命令是./search.py a.txt,您看到的只是名为a.txt的文件。

一个猜测,您对*.py看不到任何内容的原因是因为您的主目录中有多个.py文件,并且如果len(sys.argv)除了以下内容,您的脚本将明显不执行任何操作2。当shell展开*.py时,您将得到一个太长的sys.argv(因为它实际上运行的是./search.py foo.py search.py ...之类的东西)而无能为力。

要按预期运行脚本(脚本解释通配符),请引用输入内容以防止shell扩展,例如:

$ ./search.py '*.txt'

我还建议您更改参数处理,以在收到错误数量的参数时生成使用情况消息;使用错误永远都不应默默传递。