Я подозреваю, что у вас могут быть проблемы с подкаталогами.
Если у вас есть каталог с файлами "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