使用Python搜索文件夹结构并修改XML文件

时间:2017-03-22 10:04:04

标签: python xml directory-structure

我正在尝试创建一个python脚本,它将遍历文件夹结构,找到名为' bravo'的文件夹,并修改其中包含的xml文件。

在xml文件中,我想修改'位置'标签的属性,称为' file'。如:

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

我只需要将文件路径的驱动器号从“e”更改为“f”。所以它会读到:

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

...然而

这些xml文件的名称是唯一的,因此我无法搜索确切的xml文件名。相反,我正在搜索xml文件类型。

此外,我的文件夹结构中还有其他xml文件,没有'file'标记引用,我希望忽略它。

唯一不变的是我要修改的xml文件都存储在名为'bravo'的文件夹中。

我还希望创建一个日志文件,列出所有已成功更新的xml文件及其文件路径(最好是失败的文件路径)。

在本网站上使用类似问题的答案,我拼凑了以下脚本。

在当前状态下,脚本会修改它找到的每个xml文件。我无法成功添加仅搜索名为'bravo&#39;。

的文件夹的代码

当脚本修改xml文件时,而不是在&#39; bravo&#39;文件夹,它错误,因为这些文件不包含&#39;文件&#39;标签

请有人帮我纠正我的剧本(或创建新剧本)。

以下是文件夹结构的示例...

My folder structure

到目前为止我的剧本......

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

1 个答案:

答案 0 :(得分:0)

  1. 在第二次循环之前测试目录名是否适合。您必须先获取路径中的最后一个目录。如:How to get only the last part of a path in Python?

    if os.path.basename(os.path.normpath(root)) == "bravo":
    
  2. 您可以使用https://docs.python.org/3/library/logging.html模块进行记录。

  3. 如果您只想替换一个字母,那么也许您可以直接替换它而不是解析xml。正如: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)