WindowsError: [Ошибка 2] система не может найти указанный файл

у меня проблема с этим кодом. Я пытаюсь переименовать все имена файлов в папке, чтобы у них больше не было +'s в них! Это работало много раз раньше, но вдруг я получаю ошибку:

WindowsError: [Error 2] The system cannot find the file specified at line 26

строка 26-последняя строка кода.

кто-нибудь знает, почему это происходит? Я только что пообещал кому-то, что смогу сделать это за 5 минут, потому что у меня был код! Жаль, что это не работает!!

import os, glob, sys
folder = "C:Documents and SettingsDuffABureaubladJohan10G304655_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 ответов


я подозреваю, что у вас могут быть проблемы с подкаталогами.

если у вас есть каталог с файлами "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

который объединит каталог с именем файла, прежде чем вы что-либо с ним сделаете.

Edit:

я думаю, что это правильный ответ, но не совсем правильная причина.

если у вас есть файл "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() yuo говорят переименовать, чтобы посмотреть в правильном каталоге.

Изменить 2

примером требуемого кода может быть:

import os

# Use a raw string, to reduce errors with \ characters.
folder = r"C:\Documents and Settings\DuffA\Bureaublad\JohanG304655_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

вы используете 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('+','_'))

Если вы столкнулись с файлом с расширением, очевидно, попытка переименовать имя файла без расширения приведет к ошибке" файл не найден".