我正在編寫一個函數,它返回指定文件中的最大整數。這些文件只包含數字。我想出了下面的代碼;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