换行发行

2024-09-30 12:35:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要用第二个文件中的值替换XML文件。 问题是,由于某种原因,我的xml文件被完全清除,所有数据都被删除。 应该保留数据,除非它在XML文件上找到${key},然后它应该只用${value}替换它

import os
import progressbar

#VARIABLE TO CONCATENATE WITH THE FILE NAME
home = '/u01/app/oracle/mftxfer_adoc/DAYS/ola/'
#I WILL USE THIS FOLDER TO CHECK FOR FILES WITH THE NAME AJOG
directory = os.listdir('/u01/app/oracle/mftxfer_adoc/DAYS/ola/')

#THIS FILE IS MY FILTER LIST
word_list = open('/u01/app/oracle/mftxfer_adoc/DAYS/teste.txt').readlines()

#FOR EACH FILE THAT ENCOUNTERS ON THE DIRECTORY
for file_xml in directory:
    #IF THE FILENAME HAS AJOG IN IT
    if file_xml.__contains__('AJOG'):
        print("Processing the file"+" "+file_xml)
        #OPENS THE FILE
        file_read = open(home+file_xml, 'r').readlines()
        #NOW WILL CHECK IF THE LINE CONTAINS A SPECIFIC STRING
        for line in file_read:
                if "<codigo>" in line:
                        #IF HAS THEN PICKS THE FILTER
                        for word_list_line in word_list:
                                #DEVIDES THE FILTER IN 2 COLUMNS
                                key = str((word_list_line.split(' ')[0]))
                                value = str((word_list_line.split(' ')[1]))
                                #CHECKS IF THE VALUE FROM THE FIRST COLUMN IN ON THE LINE OF THE AJOG FILE
                                if key in line:
                                        print("Found the value "+key+" on file "+file_xml)
                                        #IF SO THEN REPLACE THE VALUE FROM THE FIRST COLUMN WITH THE SECOND COLUMN
                                        file_read=line.replace(key, value)
                                        #THE SAME FILE IS OPENED IN WRITE MODE
                                        file_write = open(home + file_xml, 'w')
                                        #WRITES THE CHANGES TO THE LINE
                                        file_write.writelines(file_read)

Tags: 文件thekeyinreadifvalueline
3条回答

文件被删除的原因是您在写入模式下重新打开它。执行此操作时,文件将被截断(清除)。请参阅open()描述。可以附加到文件,但不是您想要的

我认为XML解析器(如@andercurzbr answer中所建议的)是最好的解决方案。但是如果您想使用您的代码,您可以使用fileinput模块,它允许快速循环文件的行。这是一个使用fileinput编辑脚本的示例。它没有测试,但应该给你的想法

import os
import fileinput

#VARIABLE TO CONCATENATE WITH THE FILE NAME
home = '/u01/app/oracle/mftxfer_adoc/DAYS/ola/'
#I WILL USE THIS FOLDER TO CHECK FOR FILES WITH THE NAME AJOG
directory = os.listdir('/u01/app/oracle/mftxfer_adoc/DAYS/ola/')

#THIS FILE IS MY FILTER LIST
word_list = open('/u01/app/oracle/mftxfer_adoc/DAYS/teste.txt').readlines()

#FOR EACH FILE THAT ENCOUNTERS ON THE DIRECTORY
for file_xml in directory:
    #IF THE FILENAME HAS AJOG IN IT
    if file_xml.__contains__('AJOG'):
        print("Processing the file"+" "+file_xml)
        #NOW WILL CHECK IF THE LINE CONTAINS A SPECIFIC STRING WITH FILEINPUT
        for line in fileinput.input(home+file_xml, inplace=True):
            if "<codigo>" in line:
                #IF HAS THEN PICKS THE FILTER
                for word_list_line in word_list:
                    #DEVIDES THE FILTER IN 2 COLUMNS
                    key = str((word_list_line.split(' ')[0]))
                    value = str((word_list_line.split(' ')[1]))
                    #CHECKS IF THE VALUE FROM THE FIRST COLUMN IN ON THE LINE OF THE AJOG FILE
                    if key in line:
                        #print("Found the value "+key+" on file "+file_xml)
                        #IF SO THEN REPLACE THE VALUE FROM THE FIRST COLUMN WITH THE SECOND COLUMN
                        file_read=line.replace(key, value)
                        #WRITES THE CHANGES TO THE LINE
                        print(file_read)
                    else:
                        print(line)
            else:
               print(line)

注意,当使用inplace=True选项时,输出被重定向到文件本身。从文档中:

if the keyword argument inplace=True is passed to fileinput.input() or to the FileInput constructor, the file is moved to a backup file and standard output is directed to the input file (if a file of the same name as the backup file already exists, it will be replaced silently). This makes it possible to write a filter that rewrites its input file in place.

这意味着print()函数在调用fileinput.input(home+file_xml, inplace=True)写入文件之后调用。未编辑的行也必须打印出来,否则就会丢失,这就是为什么我添加了两个else

在不了解整个程序的很多上下文的情况下,我注意到您没有关闭该文件。有时看起来好像什么都没写,这是因为它都被卡在缓冲区中,没有被写,所以使用file_write.close()或者更好的方法,使用with open(filename, "w")来避免将来发生这种情况

将XML文件作为文本进行操作是一项艰巨的任务

你可以用图书馆吗

此示例可以指导您找到更好的方法

import xml.etree.ElementTree

tree = xml.etree.ElementTree.parse("test.xml")

tree.find("some key").text = 'new value'

相关问题 更多 >

    热门问题