2017-07-26 73 views
1

我有一個大型數據集,其中每列都包含文本,我想將每行轉換爲json對象,然後將其全部轉儲到文件夾路徑。因此,文件夾路徑將包含與數據集行相同數量的json文件,每個json文件都包含id和數據集每行的文本。將多個json對象轉儲到python中的一個文件夾路徑

這可能嗎?因爲,對於類似的情況,我只看到了如何創建一個巨大的json對象 - 在這種情況下這不是我想要的。這是我到目前爲止的代碼:

解決

import pandas as pd 
import os 
import sys 
from os.path import expanduser as ospath 
import simplejson as json 
import numpy as np 



sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))) 
data_folder = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "data", "model", 'Final.xlsx')) 
single_response = pd.read_excel(ospath(data_folder), sheetname='Sheet 1') 
answers_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "processes")) 


class MyEncoder(json.JSONEncoder): 
    def default(self, obj): 
     if isinstance(obj, np.int64): 
      return int(obj) 
     elif isinstance(obj, np.float): 
      return float(obj) 
     elif isinstance(obj, np.ndarray): 
      return obj.tolist() 
     elif isinstance(obj, dict): 
      return dict(obj) 
     else: 
      return super(MyEncoder, self).default(obj) 

#TODO: function will return idx and text and dump json files for each answer (idx, value) to "answers" path 

def create_answer_process(Answer, idx): 
    #answers = [] 
    for idx, value in single_response.iterrows(): 
     answer = { 
      "id": idx, 
      "pattern": value['Answer'] 
     } 
     #answers.append(answer) 

     #process = json.dumps(answers, cls=MyEncoder, indent=2) 

     with open(os.path.join(answers_path, str(idx)) + '.json', 'w') as f: 
      json.dump(answer, f, cls=MyEncoder, indent=2) 

    return idx 

感謝@keredson!

回答

1

你看起來很近。問題是這樣的一行:

process = json.dumps(answers, cls=MyEncoder, indent=2) 

您應該轉儲answer,不answers。你可能根本不需要answers。所以像這樣:

def create_answer_process(Answer, idx): 
    for idx, value in single_response.iterrows(): 
     answer = { 
      "id": idx, 
      "pattern": value['Answer'] 
     } 
     with open(os.path.join(answers_path, idx), 'w') as f: 
      json.dump(answer, f, cls=MyEncoder, indent=2) 
    return idx 
+0

你的建議,是有道理的。我改變了我的代碼,但現在我得到** TypeError:join()參數必須是str或字節,而不是'int64'**這裏:'打開(os.path.join(answers_path,idx),'w')如f:'。 如果我將此行更改爲'with open(os.path.join(answers_path),'w')as f:'我得到**權限被拒絕錯誤** 如果我將其更改爲'with open ((answers_path,idx),'w')as f:'我得到** TypeError:預期的str,字節或os.PathLike對象,而不是元組** ** – joasa

+0

在這種情況下:'with open(os.path.join answers_path),'w')爲f:'我不知道爲什麼我會得到一個** Permission denied error **。我想知道是否與每個將被轉儲的JSON對象都應該被賦予一個名稱/擴展名相關。所以,我的'answers_path',是我想要存儲所有JSON對象的文件夾的路徑,如果我要創建一個巨大的JSON對象,我會使用類似這樣的東西:'answers_path = os.path.abspath(os。 path.join(os.path.dirname(__ file__),「..」,「processes」,「processes.json」))'。但是我希望每個JSON都可以單獨轉儲。如何改革我的道路? – joasa

+0

只是'os.path.join(answers_path)',因爲你試圖打開一個dir寫入,而不是dir中的文件。第一個錯誤是因爲idx不是字符串。你在dir中想要什麼文件名? 'os.path.join(answers_path,str(idx))'應該這樣做,就像'os.path.join(answers_path,'%s.json'%idx)'一樣''等等 – keredson

相關問題