Подтвердить что ты не робот

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 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))
4b9b3361

Ответ 1

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

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

Ответ 2

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

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