Строки в Python.replace() не заменяет символы

некоторая справочная информация: у нас есть древняя веб-система базы данных документов, где я работаю, почти полностью состоящая из документов MS Office с" нормальными " расширениями (.доктор. ,XLS, а также .ррт.) Все они названы на основе какого-то произвольного идентификационного номера (т. е. 1245.доктор.) Мы переходим на SharePoint, и мне нужно переименовать все эти файлы и отсортировать их по папкам. У меня есть CSV-файл со всеми видами информации (например, какой номер ID соответствует заголовку документа), поэтому Я использую его, чтобы переименовать эти файлы. Я написал короткий скрипт на Python, который присваивает идентификационный номер.

однако некоторые из заголовков документов имеют косые черты и другие, возможно, плохие символы в заголовке файла, поэтому я хочу заменить их подчеркиванием:

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 цикл, он распечатает букву, которую он должен заменить, но на самом деле не заменит этот символ подчеркиванием, как я хочу.

есть ли что-то, что я делаю неправильно здесь?

5 ответов


вот так filename и foldername выбрасывается с каждой итерацией цикла. The .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])

вы переназначили на filename и foldername переменных на каждой итерации цикла. В сущности, только * заменяется.


вы должны посмотреть на метод строки 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)

можно упростить, сделав toreplace чем-то вроде"/\: "и т. д., Я просто использовал то, что было дано выше


вы начинаете с базовой линии вместо сохранения замененного результата, таким образом, вы получаете эквивалент

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, "_")

должны использовать string.заменить (str, fromStr, toStr)

bad_characters = ["/", "\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
    filename = string.replace(line[2], letter, "_")
    foldername = string.replace(line[5], letter, "_")