当前位置: 首页 > 知识库问答 >
问题:

Python-在遍历XML文件、搜索文本并在需要时替换它时遇到问题

谷出野
2023-03-14

我有几千个。XML文件。一些文本需要更改,因为文件是用错误的标签生成的。我需要在给定的目录中遍历所有这些文件,并在需要的地方进行更改。以下是目录中文件的示例:

<annotation>
    <folder>resized</folder>
    <filename>P123584521_009.jpg</filename>
    <path>D:\Users\path_to_image\P123584521_009.jpg</path>
    <source>
        <database>Unknown</database>
    </source>
    <size>
        <width>1024</width>
        <height>1024</height>
        <depth>3</depth>
    </size>
    <segmented>0</segmented>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>575</xmin>
            <ymin>548</ymin>
            <xmax>866</xmax>
            <ymax>759</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>827</xmin>
            <ymin>449</ymin>
            <xmax>1024</xmax>
            <ymax>798</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>198</xmin>
            <ymin>505</ymin>
            <xmax>559</xmax>
            <ymax>747</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>592</xmin>
            <ymin>730</ymin>
            <xmax>787</xmax>
            <ymax>945</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>362</xmin>
            <ymin>756</ymin>
            <xmax>597</xmax>
            <ymax>1008</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>219</xmin>
            <ymin>748</ymin>
            <xmax>376</xmax>
            <ymax>894</ymax>
        </bndbox>
    </object>
    <object>
        <name>Green plant</name>
        <pose>Unspecified</pose>
        <truncated>1</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>1</xmin>
            <ymin>648</ymin>
            <xmax>351</xmax>
            <ymax>1024</ymax>
        </bndbox>
    </object>
</annotation>

有7个注释,都名为“绿色植物”我需要用“植物”替换该短语的每次出现这是我为尝试这样做而编写的代码:

import os
from tqdm import tqdm
import sys

path = 'D:\\Users\\directory_with_all_xml_files'

files = os.listdir(path)

for file in tqdm(files):
    filename, filetype = file.split('.')
    if filetype == 'xml':
        #Open file
        xml_file = open(file)
        new_file_content = ""
        
        #Replace text
        for line in xml_file:
            stripped_line = line.strip()
            new_line = stripped_line.replace("Green plant", "Plant")
            new_file_content += new_line + "\n"
        xml_file.close()
        
        #Overwrites old file content with new file content
        write_file = open(file)
        write_file.write(new_file_content)
        write_file.close()

但是,当我运行此代码时,我得到以下结果:

  File "xml_text_replacer.py", line 13, in <module>
    xml_file = open(file)
FileNotFoundError: [Errno 2] No such file or directory: 'Name_of_very_first_xml_file_in_directory.xml'

我试图编写一个if语句来打开每个XML文件,正如您在代码中看到的那样。但是,它并不像我需要的那样迭代。可以看出,没有迭代,只列出了整个目录中的第一个.xml文件。如何更正此代码以完成此任务?

共有2个答案

马航
2023-03-14

下面的怎么样?(只需替换字符串)。< br> zz.xml包含文章的xml文本。

with open('zz.xml') as f:
    text = f.read()
    text = text.replace('<name>Green plant</name>', '<name>Plant</name>')
with open('zz_new.xml', 'w') as f:
    f.write(text)
祁博涛
2023-03-14

下面是完成这项工作的XSLT。

它遵循一种所谓的身份转换模式。

断续器

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="name[.='Green plant']">
        <xsl:copy>Plant</xsl:copy>
    </xsl:template>
</xsl:stylesheet>
 类似资料:
  • 问题内容: 我想遍历文本文件的内容,进行搜索并替换某些行,然后将结果写回到文件中。我可以先将整个文件加载到内存中,然后再写回去,但这可能不是最好的方法。 在以下代码中,执行此操作的最佳方法是什么? 问题答案: 我想类似的事情应该做。它基本上将内容写入新文件,并用新文件替换旧文件:

  • 问题内容: 如何使用Python 3搜索和替换文件中的文本? 这是我的代码: 输入文件: 当我在上面的输入文件中搜索并将“ ram”替换为“ abcd”时,它起了一种魅力。但是,反之亦然,即用“ ram”替换“ abcd”时,一些垃圾字符会保留在末尾。 用“ ram”代替“ abcd” 问题答案: fileinput已经支持就地编辑。stdout在这种情况下,它将重定向到文件:

  • 问题内容: 我正在使用Runnable每秒自动从玩家的冷却时间中减去20,但是我不知道如何在迭代过程中替换值。如何更新每个键的值? 问题答案: 使用Java 8: 使用Java 7或更旧版本: 您可以迭代条目并更新值,如下所示:

  • 本文向大家介绍python 实时遍历日志文件,包括了python 实时遍历日志文件的使用技巧和注意事项,需要的朋友参考一下 open 遍历一个大日志文件 使用 readlines() 还是 readline() ? 总体上 readlines() 不慢于python 一次次调用 readline(),因为前者的循环在C语言层面,而使用readline() 的循环是在Python语言层面。 但是 r

  • 我正试图把一个程序放在一起,将搜索整个文本文件的内容。该程序将根据字典搜索文本文件,并用字典值替换找到的任何键。我遇到了一个错误,我不知道如何继续。 示例:dictionary={key1:value1,key2:value2,key3:value3等...} 随机文本示例:在事实所有Key1之前,告诉这个任何他的。Key1坚持限制婚礼,Key2返回Key3辩论呈现。 以上事实所有的价值1告诉这个

  • 我在从Blogger导入图片到Wordpress时遇到了一个问题,不知怎的,我的内联帖子内容图片使用了所有中等大小的尺寸,这些尺寸太小了。 我尝试在Wordpress媒体设置中调整中等大小的尺寸,然后运行“重新生成缩略图”插件,但由于某些原因,我的博客导入帖子中的图像仍然太小(使用旧的中等大小图像尺寸)。 我一直在想办法解决这个问题,我认为最简单的方法就是在帖子内容中搜索并替换任何有尺寸标注的图像