繁体   English   中英

在python中找到某个字符串后如何打印所有行?

[英]How to print all the lines after it found certain string in python?

我在文件中有以下几行。 找到特定字符串后,我想读取文件。

This is 1st line
This is 2nd line
This is 3rd line
This is 4th line
This is 5th line

在这里,如果找到字符串“ 3”,我想将其后的所有行复制到另一个文件中。

我的输出应为:

This is 3rd line
This is 4th line
This is 5th line in another file.

我的代码是:

file1=open("file1.txt","r")
file2=open("file2.txt","w")
line=fo.readlines()
  for line in lines:
      if "3" in line:
         print line
         file2.write(line)

它仅单独打印此行“这是第三行”,而不打印此行之后的所有行?

这是一个完整的初学者会问的问题,所以我将其分解,请不要感到侮辱。

您需要在程序中引入状态。 此状态将告诉循环是否一直在打印,您可以通过设置变量来做到这一点,如下所示:

file1 = open("file1.txt","r")
file2 = open("file2.txt","w")
always_print = False
lines = fo.readlines()
for line in lines:
  if always_print or "3" in line:
     print line
     file2.write(line)
     always_print = True

关键是您的程序可以处于两种状态,一种状态是您已找到所关注的行,另一种状态是尚未找到它。 您使用变量来表示的方式。 通过检查该变量,您可以确定是否应该执行任何特定操作。

希望这不会太令人困惑。

print_flag = False
for line in lines:
    if "3" in line:
        print_flag = True
    if print_flag:
        file2.write(line)

编辑:一个更复杂的解决方案(就像一个知识锻炼):

line_iter = iter(lines)

for line in line_iter:
    if "3" in line:
        break
else:
    raise 'Target line not found'
file2.write(line)
for line in line_iter:
    file2.write(line)

我需要类似的东西,但是我不需要打印所有的行,而是只需要几行,直到每次出现的特定停止条件为止(如果要打印/获取所有内容,直到EOF都没有设置结束条件:

def find_occurences(file1_path, catch_start, catch_end):
    results = []
    with open(file1_path, 'r') as f1:
        lines = f1.readlines()
    i = 0
    while i < len(lines):
        if catch_start in lines[i]:
            for j in range(i + 1, len(lines)):
                if catch_end in lines[j] or j == len(lines)-1:
                    results.append(lines[i:j])
                    i = j
                    break
        else:
            i += 1
    return results

然后,如果要打印或将它们写入另一个文件,则列表中的列表会出现这些列表,您可以将其分解或在调用函数中使用它。

    for result in find_occurrences(path, start_c, end_c):
        for line in result:
            print str(line)
            with open(file_path, 'a') as f:
                f.write(str(line))

同样,如果您要按行写入文件,则可能要使用“ a”而不是“ w”,因为“ w”将替换任何现有文件内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM