具有数据init的CSV列的JSON键值

时间:2017-03-06 02:57:46

标签: python json api csv python-2.6

csv文件在每行中都有json,但是在以下格式的一列中:

╔═══╦══════════════════════╗
║   ║ 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  ║
╚═══╩════════════════╩══════════╝

我正在使用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()

3 个答案:

答案 0 :(得分:2)

使用" pandas"您可以使用以下解决方案:

1) - 安装pandas

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])

答案 1 :(得分: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(file2):

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

结果(file3):

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

答案 2 :(得分: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])