Python String.replace () ne remplaçant les caractères
-
29-09-2019 - |
Question
Quelques informations de fond: Nous avons un système de base de données de documents Web ancienne où je travaille, composé presque entièrement de documents MS Office avec les extensions « normales » (.doc, .xls, .ppt). Ils sont tous nommés d'après une sorte de numéro d'identification arbitraire (par exemple de 1245.doc). Nous passer à SharePoint et je dois renommer tous ces fichiers et de les classer dans des dossiers. J'ai un fichier CSV avec toutes sortes d'informations (comme qui correspond le numéro d'identification à laquelle le titre du document), donc je l'utiliser pour renommer ces fichiers. J'ai écrit un petit script Python qui renomme le titre du numéro d'identification.
Cependant, quelques-uns des titres des documents ont des barres obliques et d'autres personnages peut-être mauvais d'avoir un titre d'un fichier, alors je veux les remplacer par des underscores:
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
filename = line[2].replace(letter, "_")
foldername = line[5].replace(letter, "_")
- Exemple de
line[2]
: "Blah blah ennuyeux - réunion 2/19 / 2008.doc" - Exemple de
line[5]
: "Rencontres d'affaires 2/2008"
Quand j'ajoute print letter
à l'intérieur de la boucle de for
, il affichera la lettre qu'il est censé être remplacer, mais ne remplacera pas réellement ce caractère avec un trait de soulignement comme je veux.
Est-ce que je fais mal ici?
La solution
En effet, filename
et foldername
sont jetés à chaque itération de la boucle. La méthode .replace()
retourne une chaîne, mais vous n'êtes pas sauver le résultat partout.
Vous devez utiliser:
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Mais je le faire en utilisant regex. Il est plus propre et (probablement) plus rapidement:
p = re.compile('[/:()<>|?*]|(\\\)')
filename = p.sub('_', line[2])
folder = p.sub('_', line[5])
Autres conseils
Vous Réaffectation aux variables filename
et foldername
à chaque itération de la boucle. En effet, seul *
est remplacé.
Vous devriez regarder la méthode chaîne de python translate()
http://docs.python.org/library/string.html#string. traduire
avec
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)
peut simplifier en faisant quelque chose de toreplace comme « / \ :, » etc, je viens d'utiliser ce qui a été indiqué ci-dessus
Vous commencez sur la ligne de base au lieu d'enregistrer le résultat remplacé, donc vous obtenez l'équivalent
filename = line[2].replace('*', '_')
foldername = line[5].replace('*', '_')
Essayez les
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
filename = line[2]
foldername = line[5]
for letter in bad_characters:
filename = filename.replace(letter, "_")
foldername = foldername.replace(letter, "_")
Utilisez au String.replace (str, fromStr, toStr)
bad_characters = ["/", "\\", ":", "(", ")", "<", ">", "|", "?", "*"]
for letter in bad_characters:
filename = string.replace(line[2], letter, "_")
foldername = string.replace(line[5], letter, "_")