【问题标题】:Recursively search for a filename until file is found using python递归搜索文件名,直到使用 python 找到文件
【发布时间】:2019-10-02 21:13:12
【问题描述】:

使用python,如何遍历Test.txt文件中的每一行并搜索Android.mk文件,如果没有找到,则上一级目录并再次搜索直到找到文件?

/home/jenkins/workspace/art/build/apps/XYZ.cpp

在上述路径中,Android.mk 位于以下位置

/home/jenkins/workspace/art/build/apps/Android.mk
/home/jenkins/workspace/art/build/Android.mk 

/home/jenkins/workspace/frameworks/base/rs/ABC.java

在上述路径中,Android.mk 位于以下位置

/home/jenkins/workspace/frameworks/Android.mk

Test.txt

/home/jenkins/workspace/art/build/apps/XYZ.cpp /home/jenkins/workspace/frameworks/base/rs/ABC.java

DesireOutput.txt

/home/jenkins/workspace/art/build/apps/Android.mk
/home/jenkins/workspace/frameworks/Android.mk

我的尝试

with open('/data/jenkins/workspace/Experiments/Test.txt','r') as f:
    for apps in f.readlines():
        print(apps.strip())
        dirs = os.listdir( apps.strip() )
        for file in dirs:
            #print file
            if file == 'Android.mk':
                print "Android.mk found"
            else:
                os.chdir(apps.strip())
                apps.strip()
                print "Android.mk not found"

【问题讨论】:

  • 你已经尝试过什么?你知道os.walk吗?
  • @wjandrea 我认为 OP 可能在这里寻找 os.listdir(),因为他似乎想搜索特定文件夹
  • @Reedinationer 哦,对了,os.walk 下降,但 OP 想要a下降。
  • @wjandrea 也有topdown=False 选项os.walk()。也许这就是OP想要的。或者他们可能会os.listdir('/home/jenkins/workspace/art/build/apps') 然后os.listdir('/home/jenkins/workspace/art/build')(当然是自动的)。如果没有他们的代码示例尝试,很难判断什么是最好的
  • 嗨,Wjandrea,@Reedinationer - 我有示例代码,但它在 bash 中。如果我有一个 while 循环,它正在寻找文件名“Android.mk”,如果没有找到它会“cd .." 然后再看一遍.. 我想知道是否有更好的方法来使用 python 来做到这一点......

标签: python loops search


【解决方案1】:

您的脚本没有使用os.chdir('../') 升级。这是一个在while循环中实现它的脚本。您在每个循环中调用 os.chdir(apps.strip()) 而不是 os.chdir('../') 来提升一个级别。

with open('/data/jenkins/workspace/Experiments/Test.txt','r') as f:
    for apps in f.readlines():
        os.chdir(apps.strip()) # move into the folder here
        print("Starting search in {}".format(apps.strip()))
        found = False
        while not found:
            dirs = os.listdir(os.getcwd()) # print files in current directory (no argument needed)
            for file in dirs:
                if file == 'Android.mk':
                    print("Android.mk found")
                    found = True
                    break # end our for loop to save computations
            if not found:
                os.chdir("../") # move up a level for the next iteration of while loop 
                print("Android.mk not found...going up a level")

另外,dirs = os.listdir() 应该没有参数,因此它会为当前文件夹(我们更改为的文件夹)获取它。否则,无论您在文件系统中的哪个位置,它都会返回相同的结果。

【讨论】:

  • 非常感谢,这非常有帮助.. 但我收到以下错误“TypeError: listdir() 只需要 1 个参数(给定 0)”
  • @Mihir 我想我记错了,你需要提供os.getcwd()
  • 当我提供 os.listdir('.').. 再次非常感谢你
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 2010-12-24
相关资源
最近更新 更多