2011-03-21 48 views
0

我想從一些文件裏面變量值獲取變量從文件到INT(),這裏是代碼:錯誤在Python

path = '/opt/log/...' 
word = 'somevariable' 

def enumeratepaths(path=path): 
    paths = [] 
    for dirpath, dirnames, files in os.walk(path): 
     for file in files: 
      fullpath = os.path.join(dirpath, file) 
      paths.append(fullpath) 
    return paths 

def read_files(file): 
    try: 
     file_open = open(file, 'r') 
     search = file_open.read() 
     find = search.find(word) 
     find_start = find + 7 
     find_stop = find + 9 
     result = int(search[find_start:find_stop]) 
     return int(result) 
    finally: 
     file_open.close() 

def main(): 
    for files in enumeratepaths(): 
     read_files(files) 

if __name__ == "__main__": 
    main() 

的問題是,一些文件不內部有變量,因爲發生了一些錯誤。在這種情況下,該腳本將返回一個錯誤:

result = int(search[find_start:find_stop]) 
ValueError: invalid literal for int(): RE 

我想這些值作爲int,但我堅持。

還有一個問題:如果文件沒有那個搜索值,它怎麼會返回像「RE」這樣的東西?

+1

你有該文件的樣本被輸出錯誤? – Duniyadnd 2011-03-21 18:39:14

回答

3

如果find無法找到您要搜索的字符串,它將返回-1。因此,您可以檢查search.find(word)的返回值以查看word是否實際找到。

此刻你只是繼續進行搜索,即使搜索到的單詞沒有找到。 find_start將最終爲6,find_end爲8,並且可能search[6:8]包含字符「RE」,這會導致您看到的錯誤消息。

+0

謝謝,你是對的,我只是繼續,並得到了RE' – 2011-03-21 18:57:41

2

你可以解決這個問題是這樣的:

try: 
    int(somestring) 
except (ValueError, TypeError): 
    pass # not an int... what do you want to do now? 

或者,如果你總是檢查應該只是數字的字符串:

if somestring.isdigit(): 
+0

請切換順序。清潔解決方案應該是第一位的。 – 2011-03-21 18:56:11

+0

我會盡力,謝謝! – 2011-03-21 18:58:30

+0

@ S.Lott:夠公平的,我改變了它:) – Wolph 2011-03-21 19:53:55