Python 在区域中查找最后一个字符串后添加新行
我有一个input test.txt文件,其中的输出按#预期交错(在*标题区域内找到包含1的最后一行之后) 这段代码是用Python 3.6编写的Python 在区域中查找最后一个字符串后添加新行,python,python-3.x,Python,Python 3.x,我有一个input test.txt文件,其中的输出按#预期交错(在*标题区域内找到包含1的最后一行之后) 这段代码是用Python 3.6编写的 index = 0 insert = False currentTitle = "" testfile = open("test.txt","r") content = testfile.readlines() finalContent = content testfile.clos
index = 0
insert = False
currentTitle = ""
testfile = open("test.txt","r")
content = testfile.readlines()
finalContent = content
testfile.close()
# Should change the below line of code I guess to adapt
#titles = ["TitleX","TitleY","TitleZ"]
for line in content:
index = index + 1
for title in titles:
if line in title+"\n":
currentTitle = line
print (line)
if line == "1 1 1 1\n":
insert = True
if (insert == True) and (line != "1 1 1 1\n"):
finalContent.insert(index-1, currentTitle[:6] + "2" + currentTitle[6:])
insert = False
f = open("test.txt", "w")
finalContent = "".join(finalContent)
f.write(finalContent)
f.close()
更新:
提供答案的实际输出
*Title Test
12125
124125
asdas 1 1 1 1
rthtr 1 1 1 1
asdasf 1 1 1 1
asfasf 1 1 1 1
blabla 1 1 1 1
#Expected "*Title Test2" here <-- it didn't add it
124124124
*Title Dunno
12125
124125
12763125 1 1 1 1
whatever 1 1 1 1
*Title Dunno2
#Expected "*Title Dunno2" here <-- This worked great
214142122
#and so on for thousands of them..
*标题测试
12125
124125
ASDAS1
香港电台1
asdasf 1
asfasf 1
布拉布拉1
#此处应为“*Title Test2”,因为您已经将整个文件读取到内存中,所以很容易将行扫描两次;一次查找每个标题后区域的最后一个过渡,一次将修改后的数据写回同一文件名,覆盖以前的内容
我引入了一个dictionary变量transitions
,其中键是具有转换的行的索引,每个行的值是要在该点添加的文本
transitions=dict()
in_区域=False
reg_end=-1
当前标题=无
打开(“test.txt”、“r”)作为测试文件:
content=testfile.readlines()
对于idx,枚举中的行(内容):
如果行.startswith('*Title'):
#将此之前的最后一次转换提交给dict(如果有)
如果当前标题为:
转换[reg_end]=当前标题
#为打印添加后缀
当前标题=line.rstrip('\n')+'2\n'
elif line.strip().endswith('1'):
in_区域=真
#当我们停留在该区域时,这将被覆盖
reg_end=idx
埃利夫地区:
in_区域=False
如果当前标题为:
转换[reg_end]=当前标题
以open(“test.txt”、“w”)作为输出:
对于idx,枚举中的行(内容):
输出。写入(行)
如果idx处于转换中:
output.write(转换[idx])
这种“记住最后一次看到的东西”循环非常常见,但需要一些时间来适应。在循环中,请记住,我们在所有行上循环,并记住在上一次循环中看到的一些东西。(当你最终脱离循环时,忘记你应该记住的最后一件事也是一个非常常见的错误!)
查找1
之前的strip()
通过删除任何周围的空白来规范化输入。您也可以进行其他类型的规范化;规范化数据是简化逻辑的另一种非常常见的技术
演示:因为您已经在将整个文件读入内存,所以很容易对这些行进行两次扫描;一次查找每个标题后区域的最后一次转换,一次将修改后的数据写回同一文件名,覆盖以前的内容
我引入了一个dictionary变量transitions
,其中键是具有转换的行的索引,每个行的值是要在该点添加的文本
transitions=dict()
in_区域=False
reg_end=-1
当前标题=无
打开(“test.txt”、“r”)作为测试文件:
content=testfile.readlines()
对于idx,枚举中的行(内容):
如果行.startswith('*Title'):
#将此之前的最后一次转换提交给dict(如果有)
如果当前标题为:
转换[reg_end]=当前标题
#为打印添加后缀
当前标题=line.rstrip('\n')+'2\n'
elif line.strip().endswith('1'):
in_区域=真
#当我们停留在该区域时,这将被覆盖
reg_end=idx
埃利夫地区:
in_区域=False
如果当前标题为:
转换[reg_end]=当前标题
以open(“test.txt”、“w”)作为输出:
对于idx,枚举中的行(内容):
输出。写入(行)
如果idx处于转换中:
output.write(转换[idx])
这种“记住最后一次看到的东西”循环非常常见,但需要一些时间来适应。在循环中,请记住,我们在所有行上循环,并记住在上一次循环中看到的一些东西。(当你最终脱离循环时,忘记你应该记住的最后一件事也是一个非常常见的错误!)
查找1
之前的strip()
通过删除任何周围的空白来规范化输入。您也可以进行其他类型的规范化;规范化数据是简化逻辑的另一种非常常见的技术
演示:使用
试试这个,使用
因此,您希望能够找到最后一行1111并在其后面添加标题以标记下一个区域?@JordanSimba是的,这是正确的。在区域内最后一行1111,然后添加*title[Name as previous one]2more_itertools.peakable(iterable)
此类允许您在迭代器中“窥视”前方,而不使用迭代器。这可以帮助您在1111行包含1111行之后的下一行检查它。如果不是,请插入title@JordanSimba谢谢!现在我有点糊涂了,因为我从来没有用过更多的工具before如果在同一个标题
后有多个区域的1
,该怎么办?因此您希望能够找到带有1111的最后一行,并在其后面添加一个标题以标记下一个区域?@JordanSimba是的,这是正确的。在区域内带有1的最后一行,然后添加*Title[名称与前一行相同]2more\u itertools.peekable(iterable)
这个类让你在迭代器中提前“窥视”而不使用它。这可以帮助你在1111行包含1111之后的下一行检查它。如果不是,插入title@JordanSimba谢谢!现在我有点糊涂了,因为我从来没有用过更多的工具如果在同一个标题
之后有多个区域具有1
,该怎么办?您好,谢谢您的回答。是否有方法覆盖test.txt文件?例如强制使用“w”而不是打印?还有
from itertools import zip_longest
with open("test.txt","r") as f:
content = f.readlines()
results, title = [], ""
for i, j in zip_longest(content, content[1:]):
# extract title.
if i.startswith("*"):
title = i
results.append(i)
# compare value in i'th index with i+1'th (if mismatch add title)
if "1 1 1 1" in i and "1 1 1 1" not in j:
results.append(f'{title.strip()}2\n')
print("".join(results))