2017-03-06 17 views
1

有每一行,但在下面的格式一列JSON的CSV文件:JSON鍵值爲CSV列有數據初始化

╔═══╦══════════════════════╗ 
║ ║ A     ║ 
╠═══╬══════════════════════╣ 
║ 2 ║ {"discover":"123"} ║ 
║ 3 ║ {"offer":"321"}  ║ 
║ 4 ║ {"roadmap":"788789"} ║ 
║ 5 ║ {"nebravvska":"890"} ║ 
╚═══╩══════════════════════╝ 

我想上面的JSON鍵和值寫入到各csv col1和col2中的行而不替換現有數據。俄亥俄州和加利福尼亞州是現有的數據。

預期輸出:

╔═══╦════════════════╦══════════╗ 
║ ║ A    ║ B  ║ 
╠═══╬════════════════╬══════════╣ 
║ 1 ║  discover ║ 123  ║ 
║ 3 ║  offer  ║ 321  ║ 
║ 4 ║  roadmap ║ 78890 ║ 
║ 5 ║  nebrask ║ 890  ║ 
║ 6 ║  ohio  ║ hjsd8943 ║ 
║ 7 ║  california ║ 68yubkj ║ 
╚═══╩════════════════╩══════════╝ 

im使用pycharm 2.6。我下面的代碼被寫入鍵和值一列

╔═══╦════════════════╗ 
    ║ ║ A    ║ 
    ╠═══╬════════════════╣ 
    ║ 1 ║ discover 123 ║ 
    ║ 2 ║ offer 321  ║ 
    ║ 3 ║ roadmap 788789 ║ 
    ║ 4 ║ nebravvska 890 ║ 
    ╚═══╩════════════════╝ 

    with open("JSONsinfile.csv","rU") as infile: 
      with open("output.csv","a+") as outfile: 
       writer = csv.writer(outfile, delimiter=' ') 
       for line in infile: 
        d = json.loads(line) 
        writer.writerows(d.items()) 

     infile.close() 
     outfile.close() 

回答

1

您需要在現有的數據看,如果你想保留它:

代碼:

import csv 
import json 

# get current data 
with open('file1', 'rU') as f: 
    reader = csv.reader(f, delimiter=' ') 
    in_data = dict((row[0], row[1]) for row in reader) 

    # if you have python 2.7+ this also works, and looks nicer :-) 
    # in_data = {row[0]: row[1] for row in reader} 

with open("file2", "rU") as infile, open("file3", "wb") as outfile: 
    writer = csv.writer(outfile, delimiter=' ') 
    for line in infile: 
     d = json.loads(line) 
     writer.writerows(d.items()) 
     for key in d: 
      if key in in_data: 
       del in_data[key] 

    # write out any pre-existing unchanged data 
    writer.writerows(in_data.items()) 

現有數據(file1):

discover 123 
offer 321 
roadmap 78890 
nebrask 890 
ohio hjsd8943 
california 68yubkj 

傳入的JSON(文件2):

{"discover":"123"} 
{"offer":"321"} 
{"roadmap":"788789"} 
{"nebravvska":"890"} 

結果(文件3):

discover 123 
offer 321 
roadmap 788789 
nebravvska 890 
california 68yubkj 
nebrask 890 
ohio hjsd8943 
+0

後一本字典我想這個代碼在2.7中給出的語法錯誤如下 in_data = {row [0]:row [1]用於閱讀器中的行} –

+0

我只是將該代碼作爲塊剪切並粘貼,並且在2.7處運行良好。你確定你沒有2.6嗎?嘗試:'in_data = dict((row [0],row [1])in row in reader)' –

+0

我這樣做是2.6。我把那個單詞「2.7」帶回遺憾的錯字。我正在做的下面是2.6 /System/Library/Frameworks/Python.framework/Versions/2.6/bin/python2.6「/ Users/CSVJson到csv_stack.py」中的錯誤「 Traceback(最近的最後一次調用最後): 「/ Users/CSVJson to csv_stack.py」,第8行,在 in_data = dict((行[第8行 in_data = dict((row [0],row [1])for row in reader) IndexError:列表索引超出範圍 –

2

使用 「熊貓」 庫中,可以有以下解決方案:

1) - 安裝大熊貓

pip install pandas 

2) - 腳本:

import csv, json 
import csv 
import pandas as pd 

inp_csv = pd.read_csv("JSONsinfile.csv") 
lst_of_dict = inp_csv['{"discover":"123"}'].tolist() 
mydict={key:value for elem in lst_of_dict for key,value in eval(elem).items()} 

with open('output.csv', 'wb') as csv_file: 
    writer = csv.writer(csv_file) 
    for key, value in mydict.items(): 
     writer.writerow([key, value]) 
+0

這行是「lst_of_dict = inp_csv ['{」discover「:」123「}']。tolist()」將所有Json放入列表中或只放入一個JSON –

+0

這一行是創建一個列表,其中「發現」:「123」作爲第一個元素的顏色名稱,我們可以使用任何顏色名稱。它將所有的JSON放入同一個色彩列表中。 –

+0

mydict = {key:key的值爲lst_of_dict的值,eval(elem)的值爲.items()} ^ SyntaxError:無效的語法在mydict之後出現語法錯誤 –

1

下面的代碼會寫在另一列一列鍵和值,你必須創建讀取CSV像

mydict = {"discover":"123","offer:321"} 

with open('output.csv', 'wb') as csv_file: 
    writer = csv.writer(csv_file)e 
    for key, value in mydict.items(): 
     writer.writerow([key, value])