WindowsError: [Ошибка 2] Системе не удается найти указанный файл - PullRequest
13 голосов
/ 16 марта 2011

У меня проблема с этим кодом. Я пытаюсь переименовать все имена файлов в папке, чтобы в них больше не было +'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))

Ответы [ 2 ]

11 голосов
/ 16 марта 2011

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

Если у вас есть каталог с файлами "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" не будет найден в каталоге current , поскольку это не то же самое поскольку каталог os.walk() ищет. Делая вызов os.path.join(), вы говорите переименовать, чтобы искать в правильном каталоге.

Редактировать 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
4 голосов
/ 16 марта 2011

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

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

...