在Python中将JSON列表转换为CSV文件

8

我有一个 JSON 的 列表,我像这样打印它:

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”字符。你认为这是什么问题? - DeepSpace
1
DictWriter 是为你而设的,它可以将字典列表写入到 CSV 文件中。 - Jean-François Fabre
@DeepSpace 嗯,那个 u 是什么意思呢? - Dumbo
@SaeidYazdani https://dev59.com/-XE95IYBdhLWcg3wE52C@SaeidYazdani https://dev59.com/-XE95IYBdhLWcg3wE52C字符串中的-u前缀是什么意思 - DeepSpace
2个回答

13

csv.writer用于处理列表中的列表或元组,如果将其用于包含字典的列表,则会触发“需要序列”错误。相反,应使用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前缀在结果中并未出现。它只是一个表示字符。


3

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接