文件中包含最多字符的行?

时间:2013-12-17 01:52:48

标签: python file input line

我有一个文件,其长度未知的行数未知。你会如何编写一个程序来判断哪一行的字符数最多,换句话说,哪一行是最长的?

我正在考虑使用for line in myFile函数使用len(line)并将长度附加到新列表中,因此第一行的长度将为索引0,第二行的长度将转到索引1等...然后当没有更多行要检查时,使用myList.max()函数告诉我最长行的索引。

我的问题是,是否有更好/更有效的方法来产生这样的输出?也许甚至有一个我不知道的内置函数能够做到这一点。非常感谢你的帮助。

4 个答案:

答案 0 :(得分:2)

def tuple_compare(tup):
    """
    Input: 2-tuple of the form (anything, line)
    Output: Length of line with trailing newline stripped.
    """
    unused_anything, line = tup
    return len(line.rstrip('\n'))

with open('filename') as fin:
    biggest_line_number, biggest_line = max(enumerate(fin),
                                            key=tuple_compare)

让我们解开一点。 tuple_compare只取出enumerate函数中出现的元组,并返回它包含的行的长度(减去可能隐藏在那里的任何换行符)。 enumerate产生了一堆2元组(lineno, line),这就是我们将tuple_compare中的第二个元素作为行的原因。 max为我们做了所有其余的繁重工作,并根据key比较函数返回最大的元组。

在一天结束时,我们只需将元组解压缩为2个部分 - 行号和行文本。

答案 1 :(得分:2)

您可以对key函数使用max()参数,并将文件对象视为线上的迭代器:

longest_line = max(myFile, key=len)

它假设最后一行有换行符。否则:

longest_line = max((line.rstrip("\n") for line in myFile), key=len)

如果您还想要一个行号;你可以使用enumerate()

number, longest_line = max(enumerate(myFile, 1), key=lambda (i, line): len(line))

答案 2 :(得分:0)

with open('filename') as fin:
    max_len, line_num = (max((len(s),i) for i, s in enumerate(fin))

您可能希望在mgilson的回答中使用len(s.rstrip('\r'))

如果您需要以下行中的文字:

with open('filename') as fin:
    max_len, line_num, line = (max((len(s),i, s) for i, s in enumerate(fin))

答案 3 :(得分:0)

这是另外几个人给出的基本答案的另一种风格变体。我经常喜欢这种风格,因为它:

  • 利用数据管道的想法:每一步都接收输入流并生成输出流。这个成语遍布整个地方:功能编程; Unix shell;映射简化;等

  • 通常会导致可读代码:我们可以为管道中的每个步骤应用一个有意义的名称,并且生成的代码往往具有平坦,几乎声明的感觉。

    < / LI>
  • 说明以数据为中心的编程:如果我们以正确的方式转换和组织数据,我们计算的算法方面会缩小到微不足道的比例,甚至达到实际消失的程度 - - 在这种情况下,我们只需在管道的最后一个阶段调用max()

对于这方面的许多其他(以及更有趣的)示例,请搜索David Beazley关于迭代器,生成器和协同程序的在线着作。

with open('path/to/file') as fh:

    # Each pipeline step is a generator.
    stripped = (ln.rstrip('\n') for ln in fh)
    lengths  = ((len(ln), i, ln) for i, ln in enumerate(stripped))

    # The data directly answers our question.
    # We get max length, line number, and the line.
    print max(lengths)