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

时间:2012-12-03 22:52:55

标签: python xml string parsing

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

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

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

我需要在几个文件中删除该行及其前面的所有内容。 所以我需要代码来搜索该标签并删除它以及它上面的所有内容 它不会总是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()

此外,每个文件中的确切字符串不会相同。值“test”将有所不同。我或许需要检查标签名称“”

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

您可以使用tag_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)

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

答案 1 :(得分:0)

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

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

获取与正则表达式匹配的项目的索引:

listIndex = [i for i, item in enumerate(lines) if re.search(regex, item)]

切片列表:

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:]))