我正在尝试创建一个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;标签
请有人帮我纠正我的剧本(或创建新剧本)。
以下是文件夹结构的示例...
到目前为止我的剧本......
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
答案 0 :(得分:0)
在第二次循环之前测试目录名是否适合。您必须先获取路径中的最后一个目录。如:How to get only the last part of a path in Python?
if os.path.basename(os.path.normpath(root)) == "bravo":
您可以使用https://docs.python.org/3/library/logging.html模块进行记录。
如果您只想替换一个字母,那么也许您可以直接替换它而不是解析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)