【问题标题】:Write filtered json values to csv将过滤后的 json 值写入 csv
【发布时间】:2020-01-01 16:52:35
【问题描述】:

我正在循环一个 json 行文件,我只是在过滤发件人 ID 和状态并将其输出到终端。列表中有多个发件人 ID,而发件人只是一个字符串。我希望能够将输出写入一个 csv 文件,其中第一列为 STATUS,第二列为 SENDER_ID。我已在脚本顶部尝试过此操作,但不确定这是否是正确的做法。

我的脚本如下。此时我需要将其写入 csv。我已经阅读了文档,但仍然有点不确定。

import json_lines

text_file = open("senderv1.csv", "a")
with open('specifications.jsonl', 'rb') as f:
for item in json_lines.reader(f):

【问题讨论】:

  • 请从specifications.json中添加一些值以获得更多说明
  • 您不想将所有值附加到 dict/list 并将其转换为数据框,然后将其导出到 .csv 文件吗?
  • 你能举个例子吗@CeliusStingher
  • Sai kumar 领先于我并发布了答案,这里他不是打开文件,而是创建一个新文件。您是要打开现有文件并能够对其进行编辑,还是要创建一个新的 .csv 文件?
  • 你的问题到底是什么?你的代码有效吗?如果是,并且您只是在寻找改进,那么 SO 不是正确的地方,您需要 codereview。否则,请清楚解释您遇到的问题(cf stackoverflow.com/help/how-to-ask

标签: python json python-2.7 csv jsonlines


【解决方案1】:

使用 pandas,您可以创建数据框并将其保存为 csv。希望这能解决您的问题。

import json_lines 
import pandas as pd 
# text_file = open("senderv1.csv", "a") 

single_sender_status=[] 
single_sender=[] 
with open('specifications.jsonl', 'rb') as f: 
    for item in json_lines.reader(f): 
        if 'sender_id' in item: 
            single_sender_status.append(item['status']) 
            single_sender.append(item['sender_id']) 
            # text_file.write(single_sender_status) 
            # text_file.write('\t') 
            # text_file.write(single_sender) 
            # text_file.write('\n') 
            # print("Single ID " + str(single_sender)) 
        else: 
            single_sender_status.append(item['status']) 
            single_sender.append([sender['id'] for sender in item['senders']]) 
            # text_file.write(single_sender_status) 
            # text_file.write('\t') 
            # text_file.write(multiple_sender_ids) 
        # print("Multiple Sender ID'S " + str(multiple_sender_ids)) 

df=pd.DataFrame({'STATUS':single_sender_status,'SENDER_ID':single_sender}) 

df.to_csv('senderv1.csv',index=False)

【讨论】:

  • 编写一个基本的简单 CSV 文件不需要像 panda 那样庞大而复杂的依赖项——stdlib 中已经有一个 csv 模块,它同样易于使用。
【解决方案2】:

这是使用标准库中的 csv 模块编写 CSV 文件的代码。如果第一列包含状态,以下列为发件人:

#!/usr/bin/env python3
import csv

import json_lines


def main():
    with json_lines.open("specifications.jsonl") as reader:
        with open("senderv1.csv", "w", encoding="utf8") as csv_file:
            writer = csv.writer(csv_file, delimiter="\t")
            for item in reader:
                row = [item["status"]]
                if "sender_id" in item:
                    row.append(item["sender_id"])
                elif "senders" in item:
                    row.extend(sender["id"] for sender in item["senders"])
                else:
                    raise ValueError("item with no sender information")
                writer.writerow(row)


if __name__ == "__main__":
    main()

将相同的信息分布在不同的列中并不是很好,但是将多个值放入单个单元格也不是很好。 CSV 最适合二维表格数据。也许你也想要 JSON (Lines) 作为结果‽

【讨论】:

  • 你的脚本只输出了一行数据,没有循环整个jsonl文件?
  • 抱歉,writerow() 呼叫不在循环中。现在已经修好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-18
相关资源
最近更新 更多