在目录中搜索具有多个条件的项目

时间:2013-10-23 14:41:59

标签: python list directory iteration

我正在尝试编写一些搜索目录的代码,并将所有以某个数字开头的项目(由列表定义)以及以“.labels.txt”结尾。这是我到目前为止所做的。

lbldir = '/musc.repo/Data/shared/my_labeled_images/labeled_image_maps/'

picnum = []
for ii in os.listdir(picdir):
   num = ii.rstrip('.png')
   picnum.append(num)

lblpath = []   
for file in os.listdir(lbldir):
   if fnmatch.fnmatch(file, '*.labels.txt') and fnmatch.fnmatch(file, ii in picnum + '.*'):
       lblpath.append(os.path.abspath(file))

这是我得到的错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-a03c65e65a71> in <module>()
  3 lblpath = []
  4 for file in os.listdir(lbldir):
----> 5     if fnmatch.fnmatch(file, '*.labels.txt') and fnmatch.fnmatch(file, ii in picnum + '.*'):
  6         lblpath.append(os.path.abspath(file))

TypeError: can only concatenate list (not "str") to list

我意识到在picnum部分中的ii将无法工作,但我不知道如何绕过它。这可以通过fnmatch模块完成,还是需要正则表达式?

1 个答案:

答案 0 :(得分:1)

出现此错误的原因是您尝试将".*"(字符串)添加到picnum的末尾,这是一个列表,而不是字符串。

此外,ii in picnum并未向您回复picnum的每个项目,因为您没有迭代ii。它只具有在第一个循环中分配的最后一个值。

您可能会在找到与and匹配的文件时运行嵌套测试,而不是一次使用.labels.txt进行测试,如下所示。这使用re代替fnmatch从文件名的开头提取数字,而不是尝试匹配每个picnum。这取代了你的第二个循环:

import re
for file in os.listdir(lbldir):
    if file.endswith('.labels.txt')
        startnum=re.match("\d+",file)
        if startnum and startnum.group(0) in picnum:
            lblpath.append(os.path.abspath(file))

我认为这应该可行,但如果没有您的实际文件名,它显然是未经测试的。