文件中的Python最高整数

时间:2017-08-31 08:34:42

标签: python list max

我正在编写一个返回指定文件中最高整数的函数。这些文件只包含数字。我想出了以下代码;

def max_num_in_file(filename):
    """DOCSTRING"""
    with open(filename, 'r') as file:
        return max(file.read())

当我使用我创建的文本文件对其进行测试时,它会返回文件中任何行中最高的数字。我需要它来返回总体最高数字而不是一位数。

5 个答案:

答案 0 :(得分:1)

假设您的文件每行包含一个数字:

with open(path, 'r') as file:
    m = max(file.readlines(), key=lambda x: int(x))

然后m以字符串形式保存最大数量的文件,int(m)是您要查找的值。

file.readlines()为您提供一个列表,其元素是文件的行。 max内置函数采用可迭代(此处为行列表)和可选key参数。 key参数是您希望如何比较元素。

我的iterable的元素是我知道代表整数的字符串。 因此,我希望将它们作为整数进行比较。 所以我的keylambda x: int(x),这是一个匿名函数,在投放int(x)时返回x

现在,为什么max(file.read())不起作用?

file.read()为您提供与文件整个内容对应的字符串。 然后,max再次比较它传递的可迭代元素,并根据元素上定义的顺序关系返回最大元素。类型。 对于字符串(str实例),它是字典顺序。

因此,如果您的文件只包含数字,则所有字符都是数字,最大元素是与最大数字对应的字符。 因此,在大多数情况下,max(file.read())很可能会返回'9'

答案 1 :(得分:0)

只要您的文件干净且没有空/非数字行:

def max_num_in_file(filename):
    """DOCSTRING"""
    with open(filename, 'r') as file:
        return max([int(_x.strip()) for _x in file.readlines()])

答案 2 :(得分:0)

d=f.read()
max(map(int,d.split())) #given that file contains only numbers separated by ' ' 
# if file has other characters as well
max(map(int,[i for i in d.split() if i.isdigit()]))

答案 3 :(得分:0)

您需要迭代文件对象并将每行转换为int()。如果文件非常大,我会建议使用readlines(),因为它会将一个巨大的列表分配到内存中。我最好使用迭代器来完成这项工作,一次迭代一行:

def max_num_in_a_file(filename):
    def line_iterator(filename):
        with open(filename) as f:
            for line in f:
                yield int(line)
    return max(line_iterator(filename))

请注意,如果文件中的任何行无法转换为int()对象,则脚本将抛出异常。您可以保护迭代器以获取此类情况,只需跳过该行,如下所示:

def max_num_in_a_file(filename):
    def line_iterator(filename):
        with open(filename) as f:
            for line in f:
                try:
                    num = int(line)
                except ValueError:
                    continue
                yield num
    return max(line_iterator(filename))

此函数适用于包含数字和其他数据的文件,并且只会跳过不可转换为int()的行。

答案 4 :(得分:0)

您也可以通过它。

def max_num_in_file(filename):
    """DOCSTRING"""
    with open(filename, 'r') as file:
        # read every line and converting into list
        ls =  [x.strip().split() for x in file.readlines()]
        return max(map(int, sum(ls, [])))
        # sum(ls,[]) is used for converting into a single list
        # map() is used for convert string to int