【问题标题】:Converting a JSON list to CSV file in python在 python 中将 JSON 列表转换为 CSV 文件
【发布时间】:2017-11-30 12:23:21
【问题描述】:

我有一个 JSON 格式的 list,我将其打印如下:

for item in points:
    print(format(item))

结果如下:

{u'TEMP': 30, u'LIGHT': 315, u'HUMIDITY': 30.9, u'SOURCE': u'arduino_1', u'PLACE': u'kitchen', u'time': u'2016-12-31T11:18:38.822822913Z'}
{u'TEMP': 31, u'LIGHT': 325.5, u'HUMIDITY': 31.93, u'SOURCE': u'arduino_1', u'PLACE': u'garage', u'time': u'2016-12-31T11:18:39.919019993Z'}
{u'TEMP': 32, u'LIGHT': 336, u'HUMIDITY': 32.96, u'SOURCE': u'arduino_1', u'PLACE': u'living_room', u'time': u'2016-12-31T11:18:41.014792508Z'}
{u'TEMP': 33, u'LIGHT': 346.5, u'HUMIDITY': 33.99, u'SOURCE': u'arduino_1', u'PLACE': u'basement', u'time': u'2016-12-31T11:18:42.11100167Z'}

首先,我的数据源存在问题,在每个项目之前都打印了 'u' 字符。

我想用这样的格式将每一行写入 CSV 文件中(第一行是 CSV 标题)

TIME,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY
2016-12-31T11:18:38.822822913Z,arduino_1,kitchen,30,315,30.9

我正在尝试使用 csv 包来执行此操作。但我不确定如何从列表中的项目中获取每一行的数据并更改它们在生成的 CSV 文件中出现的顺序:

with open('output.csv', 'wb') as csvfile:
    writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(points)

感谢您对 Python 菜鸟的帮助。

【问题讨论】:

  • “首先,我的数据源存在问题,在每个项目之前都打印了 'u' 字符。”为什么你认为这是个问题?
  • DictWriter 是为您制作的,将 dicts 列表写入 csv 文件。
  • @DeepSpace hmmm 那u是什么意思呢?

标签: python json export-to-csv


【解决方案1】:

csv.writer 用于列表列表或元组列表。因此,将其用于 dicts 列表会触发“预期序列”错误。请改为使用csv.DictWriter,如下所示:

import csv

data=[{u'TEMP': 30, u'LIGHT': 315, u'HUMIDITY': 30.9, u'SOURCE': u'arduino_1', u'PLACE': u'kitchen', u'time': u'2016-12-31T11:18:38.822822913Z'},
{u'TEMP': 31, u'LIGHT': 325.5, u'HUMIDITY': 31.93, u'SOURCE': u'arduino_1', u'PLACE': u'garage', u'time': u'2016-12-31T11:18:39.919019993Z'},
{u'TEMP': 32, u'LIGHT': 336, u'HUMIDITY': 32.96, u'SOURCE': u'arduino_1', u'PLACE': u'living_room', u'time': u'2016-12-31T11:18:41.014792508Z'},
{u'TEMP': 33, u'LIGHT': 346.5, u'HUMIDITY': 33.99, u'SOURCE': u'arduino_1', u'PLACE': u'basement', u'time': u'2016-12-31T11:18:42.11100167Z'}]

with open("output.csv","w",newline="") as f:  # python 2: open("output.csv","wb")
    title = "time,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY".split(",") # quick hack
    cw = csv.DictWriter(f,title,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL)
    cw.writeheader()
    cw.writerows(data)

通过重复使用您提供的顺序来修复标题顺序(否则顺序是字典顺序,而不是您想要的顺序)。

写入表头获取标题,然后在字典列表中使用writerows写入数据。

输出:

time,SOURCE,PLACE,TEMP,LIGHT,HUMIDITY
2016-12-31T11:18:38.822822913Z,arduino_1,kitchen,30,315,30.9
2016-12-31T11:18:39.919019993Z,arduino_1,garage,31,325.5,31.93
2016-12-31T11:18:41.014792508Z,arduino_1,living_room,32,336,32.96
2016-12-31T11:18:42.11100167Z,arduino_1,basement,33,346.5,33.99

请注意,您担心的 u 前缀不会出现在结果中。它只是一个表示字符。

【讨论】:

    【解决方案2】:

    Pandas 有很多 I/O 工具来读/写很多文件。我猜,您正在尝试将 JSON 文件转换为 CSV。

    所以你可以这样做:

    import pandas as pd
    data = pd.read_json(path_to_input_file)
    data.to_csv(path_to_csv_output_file)
    

    【讨论】:

      猜你喜欢
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-15
      • 2023-03-03
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2018-03-06
      相关资源
      最近更新 更多