В вашем первом фрагменте кода fn
- это кортеж, так как os.walk()
возвращает кортеж dirpath (строка), dirnames (список), имен файлов (список).Таким образом, когда он присваивается nn
, nn
становится кортежем, а использование nn.replace(k, v)
в свою очередь не будет работать, потому что кортеж не имеет метода replace
.
Во втором фрагменте кода., nn
теперь равно fn[2]
(список имен).К сожалению, в списке нет метода replace
.Предполагая, что вы заменяете все :
и +
в своих именах файлов, вам необходимо выполнить цикл по каждому из этих имен файлов:
Другие вещи, которые я наблюдал и изменил в коде:
- имена файлов, возвращаемые
os.walk
, не включают полный путь к файлу, что означает, что os.rename
может не найти файл, если скрипт не запущен в том же каталоге, в котором вы переименовываете файлы,Поэтому я включил path
во время переименования. - после
os.rename
, файл в каталоге будет переименован, но имя файла, который читал код, будет таким же.Таким образом, вы также должны изменить имя файла в коде.
Итак:
import os
replacements = {':': '_', '+': '_'}
for fn in os.walk('/media/ambijat/Dataworld/f23/Dropbox/ttgis'):
path = fn[0]
nn = fn[2]
for filename in nn:
newname = filename
for k, v in replacements.items():
newname = newname.replace(str(k), str(v))
if newname != filename:
os.rename(os.path.join(path, filename), os.path.join(path, newname))
filename = newname
Хотя я бы вырезал еще одну строку кода через следующее предложение:
import os
replacements = {':': '_', '+': '_'}
for path, _, filenames in os.walk('/media/ambijat/Dataworld/f23/Dropbox/ttgis'):
for filename in filenames:
newname = filename
for k, v in replacements.items():
newname = newname.replace(k, v)
if newname != filename:
os.rename(os.path.join(path, filename), os.path.join(path, newname))
filename = newname