2017-08-31 122 views
0

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

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

当我测试这与我创建一个文本文件,它返回最高在任何文件中的行。我需要它返回整体最高号码而不是一个数字。

+2

请添加您的数据的示例。 – zipa

+1

你可以在'file.read()。split()])中返回max([int(x))' – sauerburger

回答

1

假设你的文件包含每行一个号码:

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

然后m持有作为一个字符串的文件的最大数量,以及int(m)是你正在寻找的价值。

file.readlines()给出了一个列表,其元素是文件的行。 max内置函数需要一个可迭代的(这里是行的列表)和一个可选的参数keykey的论点是你想如何比较元素。

我迭代的元素是我知道代表整数的字符串。 因此,我希望他们被比较为整数。 所以我的keylambda x: int(x),这是一个匿名函数,当进食x时返回int(x)


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

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

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

+0

这个函数必须返回一个数字,所以你的代码片段应该更好地将m转换为int结束。 – void

+0

@void这是挑剔的:)但你是对的,我编辑了。 –

0

只要你的文件是干净的,没有空/非行数:

def max_num_in_file(filename): 
    """DOCSTRING""" 
    with open(filename, 'r') as file: 
     return max([int(_x.strip()) for _x in file.readlines()]) 
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()])) 
0

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

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行() 。

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