我正在编写一个函数,它返回指定文件中的最大整数。这些文件只包含数字。我想出了下面的代码;Python中文件的最大整数
def max_num_in_file(filename):
"""DOCSTRING"""
with open(filename, 'r') as file:
return max(file.read())
当我测试这与我创建一个文本文件,它返回最高位在任何文件中的行。我需要它返回整体最高号码而不是一个数字。
我正在编写一个函数,它返回指定文件中的最大整数。这些文件只包含数字。我想出了下面的代码;Python中文件的最大整数
def max_num_in_file(filename):
"""DOCSTRING"""
with open(filename, 'r') as file:
return max(file.read())
当我测试这与我创建一个文本文件,它返回最高位在任何文件中的行。我需要它返回整体最高号码而不是一个数字。
假设你的文件包含每行一个号码:
with open(path, 'r') as file:
m = max(file.readlines(), key=lambda x: int(x))
然后m
持有作为一个字符串的文件的最大数量,以及int(m)
是你正在寻找的价值。
file.readlines()
给出了一个列表,其元素是文件的行。 max
内置函数需要一个可迭代的(这里是行的列表)和一个可选的参数key
。 key
的论点是你想如何比较元素。
我迭代的元素是我知道代表整数的字符串。 因此,我希望他们被比较为整数。 所以我的key
是lambda x: int(x)
,这是一个匿名函数,当进食x
时返回int(x)
。
现在,为什么max(file.read())
不工作?
file.read()
为您提供了与文件的全部内容对应的字符串。 然后,max
比较它传递的可迭代元素,并根据元素类型定义的顺序关系返回最大值。 对于字符串(str
实例),这是字典顺序。
因此,如果您的文件只包含数字,则所有字符都是数字,最大的元素是与最大数字对应的字符。 因此在大多数情况下max(file.read())
很可能会返回'9'
。
这个函数必须返回一个数字,所以你的代码片段应该更好地将m转换为int结束。 – void
@void这是挑剔的:)但你是对的,我编辑了。 –
只要你的文件是干净的,没有空/非行数:
def max_num_in_file(filename):
"""DOCSTRING"""
with open(filename, 'r') as file:
return max([int(_x.strip()) for _x in file.readlines()])
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()]))
您需要遍历文件对象,并转换每条线为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行() 。
你也可以通过它。
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
请添加您的数据的示例。 – zipa
你可以在'file.read()。split()])中返回max([int(x))' – sauerburger