2

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

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

<Report name="test" xmlns:cm="http://www.example.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.example.org/cm">"):
        w.writelines(item)
w.close()

此外,每个文件中的确切字符串也不相同。“测试”的值会有所不同。我可能需要检查标签名称“”<Report name”

4

2 回答 2

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 所称的“上下文管理器”——请参阅此处了解概述。对它们的简短解释是,当块完成时,它们会自动为您安全地关闭文件with:,因此您不必记住放入my_file.close()语句。

于 2012-12-03T23:22:43.017 回答
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:]))
于 2012-12-03T23:46:55.363 回答