【问题标题】:Get Line Number of certain phrase in file Python获取文件Python中某个短语的行号
【发布时间】:2021-12-04 15:21:43
【问题描述】:

我需要获取文本文件中短语的行号。这句话可能是:

the dog barked

我需要打开文件,搜索该短语并打印行号。

我在 Windows XP 上使用 Python 2.6


这就是我所拥有的:

o = open("C:/file.txt")
j = o.read()
if "the dog barked" in j:
     print "Found It"
else:
     print "Couldn't Find It"

这不是家庭作业,它是我正在进行的项目的一部分。我什至不知道如何获取行号。

【问题讨论】:

  • 到目前为止你有什么?我的意思是,我们知道您知道如何打开文件。您是如何搜索该短语的?
  • @SilentGhost,我是一个非常强大的 Python 程序员。只是以前从来没有这样做过。我已经编写了几个应用程序,特别是该公司将在未来几个月内发布的网络家长控制应用程序。打一个“死脑细胞”就行了。

标签: python file


【解决方案1】:
lookup = 'the dog barked'

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if lookup in line:
            print 'found at line:', num

【讨论】:

  • 感谢您发布 正确的方法(tm) 来做到这一点(好吧,除了行数从 0 开始 - 程序员可以,但非技术人员可能不行) . +1
  • 这行得通。现在,只是一个问题......你知道如何读取文本文件中的特定行号吗?
  • 我认为,在 python 2.6 及更高版本中,enumerate() 需要一个数字参数来开始计数,例如enumerate(myFile, 1).
  • 感谢 cmets,我为 python 2.6(打印)和从 1 开始的行编辑了它。
  • 您可以查看此帖子以在特定行打开文件:stackoverflow.com/questions/620367/…
【解决方案2】:
f = open('some_file.txt','r')
line_num = 0
search_phrase = "the dog barked"
for line in f.readlines():
    line_num += 1
    if line.find(search_phrase) >= 0:
        print line_num

1.5 年后编辑(在看到它再次获得支持后):我将保持原样;但如果我今天写的话,我会写一些更接近 Ash/suzanshakya 的解决方案的东西:

def line_num_for_phrase_in_file(phrase='the dog barked', filename='file.txt')
    with open(filename,'r') as f:
        for (i, line) in enumerate(f):
            if phrase in line:
                return i
    return -1
  • 使用with打开文件是pythonic的习惯用法——它确保当使用文件的块结束时文件将被正确关闭。
  • 使用for line in f 遍历文件比for line in f.readlines() 好得多。前者是pythonic(例如,如果f 是任何通用可迭代的;不一定是实现readlines 的文件对象),更高效的f.readlines() 在内存中创建一个包含整个文件的列表,然后遍历它. * if search_phrase in lineif line.find(search_phrase) >= 0 更 Pythonic,因为它不需要 line 来实现 find,更容易阅读以了解其意图,并且不容易搞砸(例如,if line.find(search_phrase) 和 @ 987654335@ 两者都不适用于所有情况,因为 find 返回第一个匹配项的索引或 -1)。
  • enumerate 中包装一个迭代项(如for i, line in enumerate(f))比在循环之前初始化line_num = 0 然后在循环中手动递增更简单/更干净。 (虽然可以说,这对于不熟悉enumerate 的人来说更难阅读。)

code like pythonista

【讨论】:

  • 这类似于圣地亚哥的解决方案;除了它应该 >= 0,就好像它在行首一样,如果存在该短语,find 将返回 0。 (如果它不存在,它将是-1)。
  • -1 将其恢复为 0。使用 readlines 很少是一个好主意,只需迭代文件。
  • 函数line_num_for_phrase_in_file中,是IF PHRASE IN F,还是IF PHRASE IN LINE?
【解决方案3】:
def get_line_number(phrase, file_name):
    with open(file_name) as f:
        for i, line in enumerate(f, 1):
            if phrase in line:
                return i

【讨论】:

  • 我会使用return None 而不是return 0,但这很好。
  • 我使用return 0get_line_number 的返回类型设为整数。为什么你认为return None 更好?
  • None 明确表示找不到该短语,而 0 只是一个约定。它还确保如果调用者没有检查结果,当错误被触发时,程序可能会以惊人的方式失败,从而使调试更容易。
  • 感谢马克的解释。
【解决方案4】:

suzanshakya,我实际上是在修改你的代码,我认为这样会简化代码,但是在运行代码之前,请确保文件必须在控制台的同一目录下,否则会出错。

lookup="The_String_You're_Searching"
file_name = open("file.txt")
for num, line in enumerate(file_name,1):
        if lookup in line:
            print(num)

【讨论】:

    【解决方案5】:

    打开您的文件,然后执行类似...

    for line in f:
        nlines += 1
        if (line.find(phrase) >= 0):
            print "Its here.", nlines
    

    在 Python 中有多种从文件中读取行的方法,但 for line in f 技术比大多数技术更有效。

    【讨论】:

    • 错了?在哪里? ...?如果是 > 而不是 >=,我只是修正了它,你是对的,而且......你可以指出这一点,而不是说答案是错误的和令人尴尬的。
    • @santi:尴尬的是用python写c代码。见萨沙的回答
    • 是的,我无法让它工作。不过感谢您的发帖。
    • @silent come oooon,问题不是“在文件中查找字符串的最pythonesque 方式是什么”,maan。 Zachary 似乎对 python 知之甚少,所以我写了一个与语言无关的答案。他是对的,强硬的,扎克:要寻找更好看的解决方案,请参阅 Sacha 的。
    • @mark:当然没有错! 还有。圣地亚哥似乎对括号有好处。
    【解决方案6】:
    listStr = open("file_name","mode")
    
    if "search element" in listStr:
        print listStr.index("search element")  # This will gives you the line number
    

    【讨论】:

    • 返回字符号而不是行号。
    【解决方案7】:
    for n,line in enumerate(open("file")):
        if "pattern" in line: print n+1
    

    【讨论】:

      【解决方案8】:

      这是我发现的工作:

      f_rd = open(path, 'r')
      file_lines = f_rd.readlines()
      f_rd.close()
      
      matches = [line for line in file_lines if "chars of Interest" in line]
      index = file_lines.index(matches[0])
      

      【讨论】:

        【解决方案9】:

        您可以使用列表推导:

        content = open("path/to/file.txt").readlines()
        
        lookup = 'the dog barked'
        
        lines = [line_num for line_num, line_content in enumerate(content) if lookup in line_content]
        
        print(lines)
        

        【讨论】:

          猜你喜欢
          • 2019-06-01
          • 2013-04-06
          • 2013-07-07
          • 1970-01-01
          • 2021-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多