2017-08-31 124 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