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?

Était-ce utile?

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

La modification de ce pour ajouter un exemple selon suggestion ci-dessous commentaire:
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, "_")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top