我正在编写一个返回指定文件中最高整数的函数。这些文件只包含数字。我想出了以下代码;
def max_num_in_file(filename):
"""DOCSTRING"""
with open(filename, 'r') as file:
return max(file.read())
当我使用我创建的文本文件对其进行测试时,它会返回文件中任何行中最高的数字。我需要它来返回总体最高数字而不是一位数。
答案 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的元素是我知道代表整数的字符串。
因此,我希望将它们作为整数进行比较。
所以我的key
是lambda 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