从python文件中删除字符串和字符串前面的所有行

从python文件中删除字符串和字符串前面的所有行,python,xml,string,parsing,Python,Xml,String,Parsing,我有一个包含数千行数据的文件名。 我正在读取文件名并对其进行编辑 以下标记大约有900行或更多行(每个文件不同): 我需要删除该行和它之前的所有文件。 所以我需要修改代码来搜索标签并删除它和上面的所有内容 它不会总是向下900行,它会变化;但是,标记将始终是相同的 我已经有了代码来读取行并写入文件。我只需要找到那条线的背后的逻辑,把它和之前的一切都去掉 我尝试逐行读取该文件,然后在它碰到该字符串时写入新文件,但逻辑不正确: readFile = open(firstFile) lines =

我有一个包含数千行数据的文件名。 我正在读取文件名并对其进行编辑

以下标记大约有900行或更多行(每个文件不同):


我需要删除该行和它之前的所有文件。 所以我需要修改代码来搜索标签并删除它和上面的所有内容 它不会总是向下900行,它会变化;但是,标记将始终是相同的

我已经有了代码来读取行并写入文件。我只需要找到那条线的背后的逻辑,把它和之前的一切都去掉

我尝试逐行读取该文件,然后在它碰到该字符串时写入新文件,但逻辑不正确:

readFile = open(firstFile)
lines = readFile.readlines()
readFile.close()
w = open('test','w')
for item in lines:
    if (item == "<Report name="test" xmlns:cm="http://www.domain.org/cm">"):
        w.writelines(item)
w.close()
readFile=open(firstFile)
lines=readFile.readlines()
readFile.close()
w=打开(‘测试’,‘w’)
对于行中的项目:
如果(项目==“”):
w、 书写线(项目)
w、 关闭()
此外,每个文件中的确切字符串也不相同。“测试”值将不同。我可能需要检查标记名“”
任何帮助都将不胜感激

您可以使用像
tag\u found
这样的标志来检查何时应该将行写入输出。您首先将标志设置为
False
,然后在找到正确的标记后将其更改为
True
。当标志为
True
时,将该行复制到输出文件

TAG = '<Report name="test" xmlns:cm="http://www.domain.org/cm">'

tag_found = False
with open('tag_input.txt') as in_file:
    with open('tag_output.txt', 'w') as out_file:
        for line in in_file:
            if not tag_found:
                if line.strip() == TAG:
                    tag_found = True
            else:
                out_file.write(line)
TAG=''
tag_found=False
在文件中打开('tag_input.txt'):
打开('tag_output.txt','w')作为输出文件:
对于\u文件中的行:
如果未找到标记,请执行以下操作:
如果line.strip()==标记:
tag_found=True
其他:
输出文件。写入(行)

PS:open(filename)的
语法(如在_file:
中)使用的是Python所称的“上下文管理器”——请参阅以获取概述。简短的解释是,当
with:
块完成时,它们会自动为您安全地关闭文件,因此您不必记得放入
my_file.close()
语句。

您可以使用正则表达式匹配行:

regex1 = '^<Report name=.*xmlns:cm="http://www.domain.org/cm">$'
将列表分为几部分:

listLines = lines[listIndex:]
并写入文件:

with open("filename.txt", "w") as fileOutput:
    fileOutput.write("\n".join(listLines))
伪码

试着这样做:

import re

regex1 = '^<Report name=.*xmlns:cm="http://www.domain.org/cm">$' # Variable @name
regex2 = '^<Report name=.*xmlns:cm=.*>$' # Variable @name & @xmlns:cm

with open(firstFile, "r") as fileInput:
    listLines = fileInput.readlines()

listIndex = [i for i, item in enumerate(listLines) if re.search(regex1, item)]
# listIndex = [i for i, item in enumerate(listLines) if re.search(regex2, item)] # Uncomment for variable @name & @xmlns:cm

with open("out_" + firstFile, "w") as fileOutput:
    fileOutput.write("\n".join(lines[listIndex:]))
重新导入
regex1='^$'#变量@name
regex2='^$'#变量@name&@xmlns:cm
以open(firstFile,“r”)作为文件输入:
listLines=fileInput.readlines()
listIndex=[i代表i,枚举中的项(listLines)如果重新搜索(regex1,项)]
#listIndex=[i代表i,枚举中的项(listLines)如果重新搜索(regex2,项)]#取消对变量@name和@xmlns:cm的注释
以open(“out_”+firstFile,“w”)作为文件输出:
fileOutput.write(“\n”.join(行[listIndex:]))

逐行阅读文件,在到达这一行之前忽略所有内容。我尝试过这样的方法,但是没有得到我想要的结果。这里可能我的逻辑不正确:readFile=open(firstFile)line=readFile.readlines()readFile.close()w=open('test','w'),用于行中的项:if(item==“请编辑您的问题并向其中添加代码。注释不是显示代码的地方。这很好。唯一的问题是每个文件中的确切标记不相同。“test”值将不同。我可能需要检查标记名“Report name”或者包含?你比这里的任何人都更了解你的数据,如果你认为
是的,只有一行以它开头的代码工作得很好!我从来没有用过“with”语句。如果您不介意的话,可以让我看看这里的逻辑吗?检查我添加的一点-这是一种打开文件的方法,无需记住调用
.close()
在文件上。即使程序出现问题,也应始终安全地关闭该文件。最好解释您希望正则表达式执行的操作,特别是当您向不一定熟悉它们的人推荐正则表达式时。您的假设是,
name=
字段将在不同的文件中更改,但
xmlns:cn=
字段不会这样。@Marius你是对的,在这种情况下正则表达式会有所不同。这也是一个很好的解决方案!
with open("filename.txt", "w") as fileOutput:
    fileOutput.write("\n".join(listLines))
import re

regex1 = '^<Report name=.*xmlns:cm="http://www.domain.org/cm">$' # Variable @name
regex2 = '^<Report name=.*xmlns:cm=.*>$' # Variable @name & @xmlns:cm

with open(firstFile, "r") as fileInput:
    listLines = fileInput.readlines()

listIndex = [i for i, item in enumerate(listLines) if re.search(regex1, item)]
# listIndex = [i for i, item in enumerate(listLines) if re.search(regex2, item)] # Uncomment for variable @name & @xmlns:cm

with open("out_" + firstFile, "w") as fileOutput:
    fileOutput.write("\n".join(lines[listIndex:]))