Python string.replace() не заменяет символы
Некоторая справочная информация. У нас есть старая система баз данных документов на базе Интернета, где я работаю, почти полностью состоящая из документов MS Office с "нормальными" расширениями (.doc,.xls,.ppt). Все они называются на основе какого-либо произвольного идентификационного номера (т.е. 1245.doc). Мы переключаемся на SharePoint, и мне нужно переименовать все эти файлы и отсортировать их по папкам. У меня есть файл CSV со всякой информацией (например, какой идентификационный номер соответствует заголовку документа), поэтому я использую его для переименования этих файлов. Я написал короткий Python script, который переименовывает заголовок идентификационного номера.
Однако некоторые заголовки документов имеют косые черты и другие, возможно, плохие символы в заголовке файла, поэтому я хочу заменить их символами подчеркивания:
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
filename = line[2].replace(letter, "_")
foldername = line[5].replace(letter, "_")
- Пример
line[2]
: "Бла-бла-скучно - встреча 2/19/2008.doc"
- Пример
line[5]
: "Деловые встречи 2/2008"
Когда я добавляю print letter
внутри цикла for
, он будет распечатывать букву, которую он должен заменить, но на самом деле не заменит этот символ подчеркиванием, как я хочу.
Есть ли что-то, что я делаю неправильно здесь?
Ответы
Ответ 1
Это потому, что filename
и foldername
отбрасываются с каждой итерацией цикла. Метод .replace()
возвращает строку, но вы ничего не сохраняете.
Вы должны использовать:
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Но я бы сделал это с помощью regex. Это чище и (скорее всего) быстрее:
p = re.compile('[/:()<>|?*]|(\\\)')
filename = p.sub('_', line[2])
folder = p.sub('_', line[5])
Ответ 2
Вы переназначаете переменные filename
и foldername
на каждой итерации цикла. По сути, заменяется только *
.
Ответ 3
Вы должны посмотреть на метод строки python translate()
http://docs.python.org/library/string.html#string.translate
с
http://docs.python.org/library/string.html#string.maketrans
Редактирование этого, чтобы добавить пример в соответствии с предложением комментариев ниже:
import string
toreplace=''.join(["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"])
underscore=''.join( ['_'] * len(toreplace))
transtable = string.maketrans(toreplace,underscore)
filename = filename.translate(transtable)
foldername = foldername.translate(transtable)
Можно упростить, создав туре как-то вроде '/\:,' и т.д., я просто использовал то, что было указано выше
Ответ 4
Вы начинаете с базовой строки вместо сохранения замененного результата, таким образом вы получаете эквивалент
filename = line[2].replace('*', '_')
foldername = line[5].replace('*', '_')
Попробуйте выполнить
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Ответ 5
Должен использовать string.replace(str, fromStr, toStr)
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
filename = string.replace(line[2], letter, "_")
foldername = string.replace(line[5], letter, "_")