Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.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,如何实现删除文本文档中的行直到某一行? 我使用以下代码查找行号: #!/usr/bin/env python lookup = '00:00:00' filename = "test.txt" with open(filename) as text_file: for num, line in enumerate(text_file, 1): if lookup in line: print(num) print(num)向我

如何实现删除文本文档中的行直到某一行? 我使用以下代码查找行号:

#!/usr/bin/env python
lookup = '00:00:00'
filename = "test.txt"
with open(filename) as text_file:
    for num, line in enumerate(text_file, 1):
        if lookup in line:
            print(num)
print(num)
向我输出字符串的值,例如66。 如何删除66行之前的所有行,即按单词删除找到的行?

这很简单

filename = "test.txt"
lookup = '00:00:00'
with open(filename,'r') as text_file:
    lines = text_file.readlines()
res=[]
for i in range(0,len(lines),1):
    if lookup in lines[i]:
        res=lines[i:]
        break
with open(filename,'w') as text_file:
    text_file.writelines(res)
    
建议对您的案例稍作修改:

  • 读取文件的所有行
  • 迭代行列表,直到到达关键字
  • 写下所有剩余的行
打开(“yourfile.txt”、“r”)作为f:
lines=iter(f.readlines())
打开(“yourfile.txt”、“w”)作为f:
对于行中的行:
如果在行中查找:
f、 写(行)
打破
对于行中的行:
f、 写(行)

您知道要删除哪些行吗

#!/usr/bin/env python
lookup = '00:00:00'
filename = "test.txt" 
with open(filename) as text_file, open('okfile.txt', 'w') as ok: 
    lines = text_file.readlines()
    ok.writelines(lines[4:])
这将删除前4行,并将它们存储在不同的文档中,以防您想要保留原始文档


请记住在处理完文件后关闭它们:)

提供三种备选解决方案所有以相同的第一部分开始-阅读:

filename=“test.txt”
查找='00:00:00'
以文本文件形式打开(文件名):
lines=text_file.readlines()
第二部分的变化如下:

  • 使用它将从迭代器中丢弃项,直到谓词(条件)返回
    False
    (即当谓词为
    True
    )为止。从这一点开始,在不重新检查谓词的情况下生成所有剩余项:

    导入itertools
    打开(文件名为“w”)作为文本文件:
    text_file.writelines(itertools.dropwhile(lambda行:查找不在行,行))
    
    请注意,它表示
    不在
    中。因此,找到
    查找
    之前的所有行都将被丢弃

    奖励:如果您想做相反的事情-写行,直到找到
    查找
    ,然后停止,用替换
    itertools.dropwhile

  • 使用标志值(
    found
    )确定何时开始写入文件:

    打开(文件名为“w”)作为文本文件的
    :
    发现=错误
    对于行中的行:
    如果未找到并在第行中查找:#第二个表达式“found”为True时未检查
    found=True#对于所有剩余迭代,该值保持为True
    如果发现:
    text_file.write(行)
    
  • 类似于,有一些改进-使用enumerate而不是range,然后使用最后一个索引(
    idx
    )从该点开始写入行;不需要其他中间变量:

    对于idx,枚举中的行(行):
    如果在行中查找:
    打破
    打开(文件名为“w”)作为文本文件:
    text_file.writelines(第[idx:]行)
    

  • 这回答了你的问题吗?或者,如果你认为这个问题在这个网站的其他地方有答案,可以看看@javadr,而不是将链接作为评论发布……为什么要将行保存到列表
    res
    ?为什么不直接将它们写入文件?那也可以。我尝试了你的版本,之后文件为空。我只是忘记添加查找='00:00:00'。现在应该可以工作了。谢谢,你需要的是工作。这样的时刻,在你的解决方案中,找到的字符串被删除了,如何避免呢?“谢谢,”亚历克斯丽贝尔说fixed@Tomerikoo需要在第一个循环中的
    f.write(line)
    之后添加一个
    break
    。否则,第一个循环只写入包含
    lookup
    项的行,并耗尽迭代器。使用
    中断
    ,一旦找到并写入第一行
    ,它就进入第二个循环,第二个循环写入所有剩余的行。@aneroid!抢手货这是一个社区维基,所以你可以随意修复它:)不管怎样,你做了吗