Windows错误:[错误 2] 系统找不到指定的文件

13 投票
2 回答
109201 浏览
提问于 2025-04-16 13:48

我正在尝试把一个文件夹里的所有文件名改掉里面的+符号!之前这个方法一直都能用,但突然出现了一个错误:

WindowsError: [Error 2] 系统找不到指定的文件,出现在第26行

第26行是代码的最后一行。

有没有人知道为什么会出现这个问题呢?

import os, glob, sys
folder = "C:\\Documents and Settings\\DuffA\\Bureaublad\\Johan\\10G304655_1"

for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        filename = os.path.join(root, filename)
old = "+"
new = "_"
for root, dirs, filenames in os.walk(folder):
    for filename in filenames:
        if old in filename:
            print (filename)
            os.rename(filename, filename.replace(old,new))

2 个回答

4

你正在使用 splitext 这个工具来找出要重命名的文件名:

filename_split = os.path.splitext(filename) # filename and extensionname (extension in [1])
filename_zero = filename_split[0]#
...
os.rename(filename_zero, filename_zero.replace('+','_'))

如果你遇到一个有后缀名的文件,显然,如果你试图在重命名时去掉这个后缀名,就会出现“找不到文件”的错误。

12

我怀疑你可能在处理子目录时遇到了一些问题。

假设你有一个文件夹,里面有文件"a"、"b",还有一个子文件夹"dir",里面有文件"sub+1"和"sub+2"。当你调用os.walk()时,它会返回以下内容:

(('.',), ('dir',), ('a', 'b'))
(('dir',), (,), ('sub+1', 'sub+2'))

当你处理第二个元组时,你会用rename()函数调用"'sub+1'"和"'sub_1'",但你其实想要的是"'dir\\sub+1'"和"'dir\\sub_1'"。

要解决这个问题,你需要把代码中的循环改成:

for root, dirs, filenames in os.walk(folder):
    for filename in filenames:           
        filename = os.path.join(root, filename)
        ... process file here

这样在你对文件名进行任何操作之前,会把目录和文件名连接起来。

补充:

我觉得上面的说法是对的,但原因不太准确。

假设你在目录里有一个文件"File+1",os.walk()会返回:

("C:/Documents and Settings/DuffA/Bureaublad/Johan/10G304655_1/", (,), ("File+1",))

除非你在"10G304655_1"这个目录下,否则当你调用rename()时,"File+1"这个文件在当前目录下是找不到的,因为这和os.walk()正在查找的目录不一样。通过调用os.path.join(),你是在告诉rename去正确的目录找文件。

补充 2

所需代码的一个示例可能是:

import os

# Use a raw string, to reduce errors with \ characters.
folder = r"C:\Documents and Settings\DuffA\Bureaublad\Johan\10G304655_1"

old = '+'
new = '_'

for root, dirs, filenames in os.walk(folder):
 for filename in filenames:
    if old in filename: # If a '+' in the filename
      filename = os.path.join(root, filename) # Get the absolute path to the file.
      print (filename)
      os.rename(filename, filename.replace(old,new)) # Rename the file

撰写回答