Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在区域中查找最后一个字符串后添加新行_Python_Python 3.x - Fatal编程技术网

Python 在区域中查找最后一个字符串后添加新行

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

我有一个input test.txt文件,其中的输出按#预期交错(在*标题区域内找到包含1的最后一行之后)

这段代码是用Python 3.6编写的

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]2
more_itertools.peakable(iterable)
此类允许您在迭代器中“窥视”前方,而不使用迭代器。这可以帮助您在1111行包含1111行之后的下一行检查它。如果不是,请插入title@JordanSimba谢谢!现在我有点糊涂了,因为我从来没有用过更多的工具before如果在同一个
标题
后有多个区域的
1
,该怎么办?因此您希望能够找到带有1111的最后一行,并在其后面添加一个标题以标记下一个区域?@JordanSimba是的,这是正确的。在区域内带有1的最后一行,然后添加*Title[名称与前一行相同]2
more\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))