2014-02-12 19 views
1

我有一個json文件的文件夾,我想解析特定的鍵值對。然後將這些對添加到字典中,然後將該字典(作爲json的行)輸出到新的json文件。我目前無法獲取我的文件夾中的文件進行分析,更不用說將分析後的數據彙集到字典中進行打印。這裏是我的代碼:如何通過解析json文件的文件夾然後輸出到單個文件

import json, os 

FbDict=[] 

topdir=os.getcwd() 

def main():   

    for root, dirs, files in os.walk(topdir):    
     for f in files:       
      if f.lower().endswith((".json")):      
       json_data = open(f, 'r+').read().decode("utf-8") 
       jdata = json.loads(json_data) 
       fname=f.split(".json")[0] 
       for k, v in jdata.items(): 
        if isinstance(v, dict):                 
         try: 
          dataFormat = {"created_at":v['data'][0]['created_time'],"user":v['data'][0]['from']['id'], 
               "id":v['data'][0]['id'],"name":v['data'][0]['from']['name'],"text":v['data'][0]['message']}           
           FbDict.append(json.dumps(dataFormat, separators=(',', ':')))                    
         except KeyError: 
          continue        

if __name__ == '__main__': 
    main() 
    with open ('fbFile', 'w') as f: 
     f.write(FbDict) 
+0

什麼是你的代碼錯誤?它會產生錯誤嗎?它運行但產生錯誤的輸出? – larsks

+0

@larsks哦,是的。它給了我[errno 2] - 沒有這樣的文件或目錄,並列出了一個不在文件夾中但在記事本中打開的文件。我不明白這段代碼是如何通過不屬於該文件夾的其他文件進行排序的? – user2338089

回答

1

感謝@rmunn & @Rob的幫助,這裏的更新:

import json, os 

FbDict=[] 

def main():   

    for root, dirs, files in os.walk(os.getcwd()):    
     for f in files:       
      if f.lower().endswith((".json")):      
       f = os.path.join(root, f) 
       with open(f, 'r') as f: json_data=f.read().decode("utf-8") 
       jdata = json.loads(json_data)      
       for k, v in jdata.items(): 
        if isinstance(v, dict):                 
         try: 
          dataFormat = {"created_at":v['data'][0]['created_time'],"user":v['data'][0]['from']['id'], 
              "id":v['data'][0]['id'],"name":v['data'][0]['from']['name'],"text":v['data'][0]['message']}           
          if dataFormat no in FbDict: 
           FbDict.append(json.dumps(dataFormat, separators=(',',':')))       
          else: 
           continue    
         except KeyError: 
          continue 
       f.close() 

if __name__ == '__main__': 
    main() 
    with open ('fbFile.json', 'w') as f_out: 
     for line in fbDict: 
      f_out.write(line+'\n') 
     f_out.close() 
+1

找到自己的答案並張貼它的好工作。如果它是正確的,你也可以接受你自己的答案。兩個批評:1)你不需要「r +」,「r」會更合適,2)你不關閉你打開的文件。嘗試'打開(f,'r')爲f:json_data = f.read()。decode('utf-8')'。 –

+0

@Robᵩ感謝您的幫助!我會在更新中添加您的建議。我如何添加功能來通過子文件夾? – user2338089

+0

我是個白癡。它已經做到了。 – user2338089

1

這裏就是你缺少的部分從Python文檔:

http://docs.python.org/2/library/os.html#os.walk

注意的是,在名單上的名字不包含路徑組件。要獲取完整路徑(以top開頭)到dirpath的文件或目錄,請執行os.path.join(dirpath, name)

現在你只是在迭代files,這是沒有任何路徑信息的裸文件名。添加路徑信息,你應該停止獲取那些「找不到文件」的錯誤。

+0

這是有道理的,我只是在哪裏添加它而感到困惑? – user2338089

+1

@ user2338089 - 你想只搜索頂級文件,還是搜索所有json文件,遞歸遍歷所有子目錄? –

+0

@Robᵩ越做越好,所以所有子目錄都會有所幫助 – user2338089