2014-01-24 35 views
0

我有兩種類型的txt文件,其中一個保存在一些任意格式的形式檢查文件是JSON加載

Header 
key1 value1 
key2 value2 

和其他文件formart上存儲爲

一個簡單的JSON轉儲
with open(filename,"w") as outfile: 
    json.dump(json_data,outfile) 

從一個對話窗口,用戶可以裝載這兩個文件的,但我的裝載機需要能夠Type1和Type2之間的區別和文件發送到正確的負載程序。

#Pseudocode 
def load(filename): 
    if filename is json-loadable: 
     json_loader(filename) 
    else: 
     other_loader(filename) 

我能想到的最簡單方法是使用try/except塊作爲

def load(filename): 
    try: 
     data = json.load(open(filename)) 
     process_data(data) 
    except: 
     other_loader(filename) 

但因爲有像50/50風險的失敗中,我不喜歡這種方法嘗試/除了塊,並且據我所知,嘗試/除非失敗,否則很慢。

那麼,有沒有檢查如果JSON格式與否的更簡單,更便捷的方式?

+1

「據我所知嘗試/除非你失敗是慢」 - 與從磁盤讀取文件相比?它確實不是。 –

+0

Python異常不是特別昂貴,在任何情況下,這聽起來都像是不成熟的優化。 – geoffspear

+0

的確,速度在這種情況下並不是真正的問題,而是使用try/except。我閱讀了關於試/除外,看到此評論http://docs.python.org/2/glossary.html#term-eafp它說,嘗試/除了在Python實際上是鼓勵這樣也許我的代碼是好的,因爲它是! – pathoren

回答

0

如果您要轉儲的頂級數據是對象,則可以檢查第一個字符是{還是[如果是數組。這隻有在其他格式的標題永遠不會以這些字符開頭時纔有效。這也不是萬無一失的,因爲它不能保證你的數據格式良好的JSON。

在另一方面現有的解決方案是好的,更加明確有力。

+0

我同意你的觀點並堅持我原來的解決方案。正如你所說,它「清晰而強健」。認爲有易於讀取的代碼相比,超cryptical單行,因爲你會閱讀代碼你寫更多的往往比你實際寫它更重要! :) – pathoren

0

你可以做這樣的事情:

def convert(tup):                
    """                    
    Convert to python dict.               
    """                    
    try:                   
     tup_json = json.loads(tup)             
     return tup_json                
    except ValueError, error: # includes JSONDecodeError       
     logger.error(error)               
     return None 


converted = convert(<string_taht_neeeds_to_be_converted_to_json>): 
if converted:  
    <do_your_logic> 
else: 
    <if_string_is_not_converteble>