2017-03-22 3 views
0

Merci de me supporter car je ne connais pas encore le codage et ce forum! J'essaie de créer un script python qui va parcourir une structure de dossiers, trouver les dossiers nommés 'bravo' et modifier les fichiers xml qu'ils contiennent.Recherche dans une structure de dossiers et modification de fichiers XML en utilisant Python

Dans les fichiers xml, je veux modifier l'attribut « emplacement » d'une balise, appelée « fichier ». Tels que:

<file location="e:\one\two"/> 

J'ai juste besoin de changer la lettre de lecteur du chemin de fichier de «e» à «f». Alors qu'il va lire:

<file location="f:\one\two"/> 

Mais ...

Le nom de ces fichiers xml sont uniques, je ne peux pas rechercher le nom du fichier xml exacte. Au lieu de cela, je recherche par le type de fichier xml.

En outre, il existe d'autres fichiers xml dans ma structure de dossiers, sans la référence de balise 'file', que je souhaite ignorer. La seule constante est que les fichiers xml que je veux modifier sont tous stockés dans des dossiers nommés, 'bravo'. Je souhaite également créer un fichier journal qui répertorie tous les fichiers XML et leurs chemins de fichiers qui ont été mis à jour avec succès (et de préférence ceux qui ont échoué).

En utilisant des réponses à des questions similaires sur ce site, j'ai bricolé le script suivant.

Dans son état actuel, le script essaye de modifier tous les fichiers XML qu'il trouve. Je n'ai pas réussi à ajouter du code qui recherche uniquement les dossiers appelés "bravo". Lorsque le script modifie un fichier xml, pas dans un dossier «bravo», il commet des erreurs car ces fichiers ne contiennent pas de balise «file».

S'il vous plaît quelqu'un pourrait me aider à corriger mon script (ou en créer un nouveau).

Voici un exemple de la structure du dossier ...

My folder structure

Et mon script jusqu'à présent ...

from xml.dom import minidom 
    import os 

    # enter the directory where to start search for xml files... 

    for root, dirs, files in os.walk("c:/temp"): 
     for file in files: 
      #search for xml files... 
      if file.endswith(".xml"): 
       xml_file = file 

       xmldoc = minidom.parse(os.path.join(root, xml_file)) 

       # in the xml file look for tag called "file"... 
       file_location = xmldoc.getElementsByTagName("file") 
       # i don't understand the next line of code, but it's needed 
       file_location = file_location[0] 

       # 'location_string' is a variable for the 'location' path of the file tag in the xml document 
       location_string = (file_location.attributes["location"].value) 

       # the new drive letter is added to the location_string to create 'new_location' 
       new_location = "f" + location_string[1:] 

       # replace the 'location' value of the file tag with the new location... 
       file_location.attributes["location"].value = new_location 

       # write the change to the original file 
       with open((os.path.join(root, xml_file)),'w') as f: 
       f.write(xmldoc.toxml()) 
       print "%s has been updated!" % (os.path.join(root, xml_file)) 
       # add updated file name to log... 
       log_file = open("filepath_update_log.txt", "a") 
       log_file.write("%s\n" % (os.path.join(root, xml_file))) 
       log_file.close 

Toute aide sera grandement appréciée!

Répondre

0
  1. Testez si le nom du répertoire correspond avant votre deuxième boucle. Vous devez d'abord obtenir le dernier répertoire dans le chemin. Comme dans: How to get only the last part of a path in Python?

    if os.path.basename(os.path.normpath(root)) == "bravo": 
    
  2. Vous pouvez utiliser le module https://docs.python.org/3/library/logging.html pour l'enregistrement.

  3. Si vous souhaitez uniquement remplacer une seule lettre, vous pouvez peut-être la remplacer directement au lieu d'analyser xml.Comme le suggère: https://stackoverflow.com/a/17548459/7062162

    def inplace_change(filename, old_string, new_string): 
        # Safely read the input filename using 'with' 
        with open(filename) as f: 
         s = f.read() 
         if old_string not in s: 
          print('"{old_string}" not found in {filename}.'.format(**locals())) 
          return 
    
        # Safely write the changed content, if found in the file 
        with open(filename, 'w') as f: 
         print('Changing "{old_string}" to "{new_string}" in {filename}'.format(**locals())) 
         s = s.replace(old_string, new_string) 
         f.write(s) 
    
+0

tas Merci ... Votre point 1 a travaillé un régal et je vais lire sur le module d'enregistrement. – Ant78