【问题标题】:Convert JSON to CSV with Python 3使用 Python 3 将 JSON 转换为 CSV
【发布时间】:2018-03-03 05:01:49
【问题描述】:

我需要从 Meetup API 获取一些数据,将我得到的 JSON 转换为 CSV,所有这些都在 Python 3 中完成。我从未使用过 JSON 或 Python,因此遇到了一些问题。获取数据不是问题,但我似乎无法将 JSON 对象解析为正确的 CSV 文件。我的代码,匿名:

import json
import requests
import csv


def main():
    # initialize variables
    output_file = 'result_meetup.csv'
    api_key = "YOUR_MEETUP_API_KEY"
    params = {'key': api_key}
    url_path = 'http://api.meetup.com/pro/:URLNAME/groups'

    # get data from API, parse to JSON
    data = requests.get(url_path, params=params)
    data_parsed = data.json()
    length_data = len(data_parsed) - 1

    data_to_file = open(output_file, 'w')
    csv_writer = csv.writer(data_to_file)

    for i in range(0, length_data):
        meetup = data_parsed[i]
        csv_writer.writerow([meetup])
    data_to_file.close()


if __name__ == "__main__":
    main()

现在,如您所见,我将 CSV 作为列表写入。这会导致非常丑陋的输出,如下所示(同样,大写字母中的值是匿名的):

{u'rsvps_per_event': 0.0, u'organizers': [{u'permission': u'organizer', u'name': u'NAME', u'member_id': ID}], u'repeat_rsvpers': 0, u'topics': [{u'lang': u'en_US', u'id': ID, u'urlkey': u'socialnetwork', u'name': u'Social Networking'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'education', u'name': u'Education'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'newtech', u'name': u'New Technology'}, {u'lang': u'en_US', u'id': ID, u'urlkey': u'business-referral-networking', u'name': u'Business Referral Networking'}], u'upcoming_events': 0, u'gender_female': 0.3499999940395355, u'pro_join_date': DATE, u'id': ID, u'category': [{u'shortname': u'career-business', u'sort_name': u'Career & Business', u'id': 2, u'name': u'Career & Business'}], u'city': u'CITY', u'member_count': 73, u'lon': LON, u'organizer_photo': {u'thumb_link': u'LINK.JPEG', u'base_url': u'URL', u'id': ID, u'type': u'member', u'photo_link': u'LINK.JPEG', u'highres_link': u'LINK.JPEG'}, u'average_age': 35.555599212646484, u'status': u'Active', u'description': u'DESCRIPTION' u'founded_date': DATE, lat': LAT, u'urlname': u'NAME', u'gender_male': 0.6000000238418579, u'name': u'NAME', u'country': u'Portugal', u'gender_unknown': 0.05000000074505806, u'past_events': 0, u'gender_other': 0.0, u'past_rsvps': 0}

所以基本上,整个 JSON 对象在单个 CSV 字段中,带有奇怪的 'u',在列表中等等。但是,如果我不把它写成一个列表,我只会得到 JSON 对象的字段,没有数据,所以它只是“组织者”、“名称”等,没有实际名称。 正如我所说,我是一个 python 初学者,还没有找到任何库来帮助我,但我确信它们存在。非常感谢任何帮助,如果它与 Python3 兼容,那就太好了。

编辑:我希望它最终的样子: 我在回复中收到了多个 Meetup 组,它们都具有与上图相同的结构。因此,值的描述应该只列出一次,作为标题,下面列出的值(新行和管道表示 csv 表的新字段):

RSVPs_per_event | Organizer | ID 
5               | Tom       | 1
20              | Jack      | 2
35              | Anne      | 3

【问题讨论】:

  • JSON 可以具有高度嵌套的结构,CSV 无法轻易表示。我已经通过jsonlint 运行了您的回复(虽然这实际上是一本字典,但会提供一种可读的格式)并且那里有很多信息。您需要显示您的预期输出
  • 理想情况下,由于我的回复中的所有 JSON 对象都具有相同的结构,因此最好在标题行中包含值的描述,例如“Organizer”,然后是值下面列出的每个对象。
  • 类似:组织者 |汤姆 |杰克 |等,但在彼此下方,而不是彼此相邻(不能在回复中进行格式化)
  • 你看过jsonlint中的响应了吗?如果这是整个响应,那么它远非正常,并且如果这是响应的单个单元,那么您将需要更多详细信息来了解它在 CSV 中的表示方式。您应该编辑您的问题以提供正确的输出格式,添加 cmets 很少会增加此类内容的清晰度 - 我现在对您的预期输出没有比以前更清楚了。
  • 会的,谢谢。而且我不知道jsonlint,我去看看

标签: python json python-3.x csv meetup


【解决方案1】:

要将json 数据转换为csv,您需要提取键并将它们写入标题,然后处理值。这可能会对您有所帮助:

data_parsed = json.loads(Data)

header = data_parsed[0].keys()
csv_writer.writerow(header)

for i in range(0,length_data)
    meetup = data_parsed[i].values()
    csv_writer.writerow([meetup])

【讨论】:

  • 不确定这是否可行,因为organizers 的值是一个字典列表
  • 我尝试了这个解决方案,不幸的是,结果看起来并没有好多少。它删除了开头的 '{u'rsvps_per_event': ',但其余部分看起来相同。不过还是谢谢
  • 可能是json解析不正确。你可以试试data_parsed = json.loads(Data)
  • 如果你可以粘贴data_parsed的输出,我可以相应地修改答案。
  • 如果我尝试 data_parsed = json.loads(data),我得到一个错误:“TypeError: the JSON object must be str, bytes or bytearray, not 'Response'”,这就是我这样做的原因另一种方式
【解决方案2】:

如果其他人有同样的问题,我解决了,不是很优雅,但我需要数据。 JSON 过于复杂,无法解析,所以现在我只需从数据中读取我需要的字段。

import json
import requests
import csv


def main():
    # initialize variables
    output_file = 'result_meetup.csv'
    api_key = "YOUR_API_KEY"
    params = {'key': api_key}
    url_path = 'http://api.meetup.com/pro/:URLNAME/groups'

    # get data from API, parse to JSON
    data = requests.get(url_path, params=params)
    data_parsed = data.json()
    length_data = len(data_parsed) - 1

    data_to_file = open(output_file, 'w', newline='')
    csv_writer = csv.writer(data_to_file, delimiter=";")
    csv_writer.writerow(["id","name","city","country","member count","average age","founded_date","past_rsvps","rsvps_per_event","repeat_rsvpers","gender_unknown","gender_female","gender_male","gender_other"])

    for i in range(0, length_data):
        meetup = data_parsed[i]
        id = meetup['id']
        name = meetup['name']
        city = meetup['city']
        country = meetup['country']
        member_count = meetup['member_count']
        average_age = meetup['average_age']
        founded_date = meetup['founded_date']
        past_rsvps = meetup['past_rsvps']
        rsvps_per_event = meetup['rsvps_per_event']
        repeat_rsvpers = meetup['repeat_rsvpers']
        gender_unknown = meetup['gender_unknown']
        gender_female = meetup['gender_female']
        gender_male = meetup['gender_male']
        gender_other = meetup['gender_other']
        csv_writer.writerow([id,name,city,country,member_count,average_age,founded_date,past_rsvps,rsvps_per_event,repeat_rsvpers,gender_unknown,gender_female,gender_male,gender_other])
    data_to_file.close()


if __name__ == "__main__":
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-04
    • 2019-02-23
    • 2021-09-01
    • 2021-12-03
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多