os.scandir()在循环中为find()创建问题

时间:2019-01-16 14:18:37

标签: python python-3.x

我尝试在从os.scandir()派生的文件名中找到一个字符串 就像“ ilikecake15.pdf”或“ ilike1615cake.pdf”中的字符串“ 15”一样。字符串是唯一的。 这段代码的背景:我有几个要与列表匹配的PDF文件夹。文件名包含列表中部分字符串。 我认为使用to for循环可以解决问题,可以从txt获取信息。另一个来自os.scandir()和find()来检查!= -1。

故障排除给我留下了两个我试图与s.find(ins)比较的.txt值。我的目标是找出!= -1。 如果我定义v1和v2并执行v1.find(v2),这似乎可行,但是在嵌套的for循环中,一切都显示为-1。 (即使我看到正确的对决) 我已经使用[xx]从文本文件中删除了路径信息,例如G:\ thispath \和\ thispath。甚至尝试将str()添加到几乎所有内容(以防万一)

import os
tdpath = 'G:\Somepathwithalotofpdfs'
tdfiles = 'G:\Anothersuitablepath/tdfiles.txt'
tdlines = 'G:\Anothersuitablepath/tdlines.txt'
with os.scandir(tdpath) as pth, open(tdfiles, 'w') as fls:
    for td in pth:
        if td.is_file():
            fls.write(str(os.fsdecode(td)[51:])) #str and [51:] added to help troubleshoot
            fls.write('\n')

with open(tdlines) as fp, open(tdfiles) as fls:
    for cnt, line in enumerate(fp):
        for cmt, lajn in enumerate(fls):
            print(lajn, line) #just troubleshooting
            print(str(lajn).find(str(line))) #just troubleshooting
            if lajn.find(line) != -1:
                print('KASWSOFJIDFHAIFHSIHFIAHS') # Hlep ples

在尝试对其进行故障排除时,它变成了怪物。但是预期的结果是,当它从tdfiles.txt中的文件tdlines.txt找到匹配项时,打印后一条语句

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全了解您所描述的问题的性质,但是我确实看到一件事几乎肯定不会像您期望的那样。

一旦遍历一个打开的文件对象的所有行,再次尝试对其进行遍历将不会产生任何结果,因为跟踪文件中工作位置的内部指针现在位于末尾。因此,对于tdlines的第一行,您的循环将按预期运行,但是对于其余各行,内部的for循环将永远不会运行。

解决方案是在每次迭代中通过tdfiles关闭并重新打开tdlines,或者在内部for循环之前将seek()返回文件的开头。这是后一种方法:

with open(tdlines) as fp, open(tdfiles) as fls:
    for cnt, line in enumerate(fp):
        fls.seek(0)
        for cmt, lajn in enumerate(fls):
            if lajn.find(line) != -1:
                print('KASWSOFJIDFHAIFHSIHFIAHS')