我正在尝试编写一些搜索目录的代码,并将所有以某个数字开头的项目(由列表定义)以及以“.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模块完成,还是需要正则表达式?
答案 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))
我认为这应该可行,但如果没有您的实际文件名,它显然是未经测试的。