我有一个包含数千行数据的文件名。 我正在读取文件名并进行编辑。
以下标记约为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”将有所不同。我或许需要检查标签名称“”
非常感谢任何帮助。
答案 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:]))