WindowsError:[错误2]系统找不到指定的文件,无法在Python中解析

时间:2016-02-28 10:03:18

标签: python python-2.7

我制作了一个Python程序,它将清除我下载的torrent文件+文件夹中不必要的名称,以便我可以毫不费力地将其上传到我的无限制Google云端硬盘存储帐户。

但是,在经过一定次数的迭代后,它会给我WindowsError: [Error 2] The system cannot find the file specified如果我再次运行程序,它会在某些迭代中正常工作,然后弹出相同的错误。

请注意,我已使用os.path.join采取预防措施以避免此错误,但它会不断出现。由于此错误,我必须在选定的文件夹/驱动器上运行该程序数十次。

这是我的计划:

import os
terms = ("-LOL[ettv]" #Other terms removed
)
#print terms[0]
p = "E:\TV Series"
for (path,dir,files) in os.walk(p):
    for name in terms:
        for i in files:
            if name in i:
                print i
                fn,_,sn = i.rpartition(name)
                os.rename(os.path.join(path, i), os.path.join(path, fn+sn))
        for i in dir:
            if name in i:
                print i
                fn,_,sn = i.rpartition(name)
                os.rename(os.path.join(path, i), os.path.join(path, fn+sn))

错误回溯:

Traceback (most recent call last):
File "E:\abcd.py", line 22, in <module>
os.rename(os.path.join(path, i), os.path.join(path, fn+sn))
WindowsError: [Error 2] The system cannot find the file specified

1 个答案:

答案 0 :(得分:3)

由于os.walk的工作方式,子目录可能存在问题,即在第一次使用子目录后的下一次迭代中pathos.walk收集子目录的名称,以便在当前目录中的第一次迭代中进一步迭代访问...

例如,在第一次致电os.walk时,您会得到:

('.', ['dir1', 'dir2'], ['file1', 'file2'])

现在您重命名文件(这样就行了),并将'dir1'重命名为'dirA',将'dir2'重命名为'dirB'

os.walk的下一次迭代中,您得到:

('dir1', ['subdir1-2', 'subdir1-2'], ['file1-1', 'file1-2'])

这里发生的事情就是没有'dir1'了,因为它已经在文件系统上重命名了,但是os.walk仍然会记住它在列表里面的旧名称并将它提供给你。现在,当您尝试重命名'file1-1'时,您要求'dir1/file1-1',但在文件系统上它实际上是'dirA/file1-1'并且您收到错误。

要解决此问题,您需要更改os.walk在进一步迭代中使用的列表中的值,例如:在你的代码中:

for (path, dir, files) in os.walk(p):
    for name in terms:
        for i in files:
            if name in i:
                print i
                fn, _, sn = i.rpartition(name)
                os.rename(os.path.join(path, i), os.path.join(path, fn+sn))
        for i in dir:
            if name in i:
                print i
                fn, _, sn = i.rpartition(name)
                os.rename(os.path.join(path, i), os.path.join(path, fn+sn))
                #here remove the old name and put a new name in the list
                #this will break the order of subdirs, but it doesn't
                #break the general algorithm, though if you need to keep
                #the order use '.index()' and '.insert()'.
                dirs.remove(i)
                dirs.append(fn+sn)

这应该可以解决问题,并且如上所述,将导致......

第一次致电os.walk

('.', ['dir1', 'dir2'], ['file1', 'file2'])

现在将'dir1'重命名为'dirA',将'dir2'重命名为'dirB'并更改列表,如上所示...现在,在os.walk的下一次迭代中它应该是:

('dirA', ['subdir1-2', 'subdir1-2'], ['file1-1', 'file1-2'])