【问题标题】:Search a text file and print related lines in Python?在 Python 中搜索文本文件并打印相关行?
【发布时间】:2011-06-14 16:32:32
【问题描述】:

如何在文本文件中搜索关键短语或关键字,然后打印关键短语或关键字所在的行?

【问题讨论】:

    标签: python file search


    【解决方案1】:
    searchfile = open("file.txt", "r")
    for line in searchfile:
        if "searchphrase" in line: print line
    searchfile.close()
    

    打印多行(以简单的方式)

    f = open("file.txt", "r")
    searchlines = f.readlines()
    f.close()
    for i, line in enumerate(searchlines):
        if "searchphrase" in line: 
            for l in searchlines[i:i+3]: print l,
            print
    

    print l, 中的逗号可防止输出中出现多余的空格;尾随的 print 语句区分不同行的结果。

    或者更好(从 Mark Ransom 那里偷回来):

    with open("file.txt", "r") as f:
        searchlines = f.readlines()
    for i, line in enumerate(searchlines):
        if "searchphrase" in line: 
            for l in searchlines[i:i+3]: print l,
            print
    

    【讨论】:

    • 处理后关闭文件。
    • 如何打印该行和它下面的其他三行?
    • senderle,在我接受您的回答之前,您或其他人能否解释一下我将如何在搜索行下方打印三行?
    • file.readlines() 对于大文件不是很有效。改用 file.read()
    • @ekta,OP 要求提供行号,因此必须以某种方式将数据分成几行。在您看来,什么会比readlines 更有效?
    【解决方案2】:
    with open('file.txt', 'r') as searchfile:
        for line in searchfile:
            if 'searchphrase' in line:
                print line
    

    向我公然抄袭的senderle 道歉。

    【讨论】:

    • +1。我很生气——但后来我花了一点时间来理解 with 语句。这太棒了!
    • @senderle,谢谢。我考虑只是编辑你的答案,但我认为这会更烦人 - 而with 语句是 Python 的一个相当新的补充,使你的答案最适合某些人。你很久以前就收到了我的 +1!
    • 是的,最近对我来说,神秘的,加法,直到现在;我不得不承认,几周前我一直在努力理解 with 语句并且出现了空白——但这个简单的例子完美地解释了它。
    • 不错。对于其他偶然发现此问题的人,此方法会在之后自动关闭文件。 effbot.org 上有一个很好的解释:Understanding Python's "with" statement
    【解决方案3】:

    注意“i+3”可能会出现超出范围的索引。你可以这样做:

    with open("file.txt", "r") as f:
        searchlines = f.readlines()
    j=len(searchlines)-1
    for i, line in enumerate(searchlines):
        if "searchphrase" in line: 
            k=min(i+3,j)
            for l in searchlines[i:k]: print l,
            print
    

    编辑:也许没有必要。我只是测试了一些例子。如果 y 超出范围,x[y] 会报错,但 x[y:z] 似乎不会因为 y 和 z 的值超出范围而报错。

    【讨论】:

    • 切片不会产生超出范围的错误。当你切片时,你说“给我这个范围内的项目列表”。如果给定范围内没有项目,则空列表会提供所要求的内容。另一方面,索引表示“给我索引i 处的确切项目”。如果i 没有项目,那么返回一些东西——甚至是None——都是谎言,所以最好抛出一个异常。
    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2014-09-06
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多