【问题标题】:Python - JSON to CSV table?Python - JSON 到 CSV 表?
【发布时间】:2014-07-14 04:17:25
【问题描述】:

我想知道如何导入 JSON 文件,然后将其保存到有序的 CSV 文件中,其中包含标题行和下面的适用数据。

JSON 文件如下所示:

 [
  {
    "firstName": "Nicolas Alexis Julio",
    "lastName": "N'Koulou N'Doubena",
    "nickname": "N. N'Koulou",
    "nationality": "Cameroon",
    "age": 24
  },
  {
    "firstName": "Alexandre Dimitri",
    "lastName": "Song-Billong",
    "nickname": "A. Song",
    "nationality": "Cameroon",
    "age": 26,
    etc. etc. + } ]

注意有多个“键”(名字、姓氏、昵称等)。我想创建一个 CSV 文件,以这些文件作为标题,然后在下面的行中创建适用的信息,每一行都有玩家的信息。

这是我目前为 Python 编写的脚本:

import urllib2
import json
import csv

writefilerows = csv.writer(open('WCData_Rows.csv',"wb+"))


api_key = "xxxx"
url = "http://worldcup.kimonolabs.com/api/players?apikey=" + api_key + "&limit=1000"
json_obj = urllib2.urlopen(url)
readable_json = json.load(json_obj)
list_of_attributes = readable_json[0].keys()

print list_of_attributes


writefilerows.writerow(list_of_attributes)

for x in readable_json:
    writefilerows.writerow(x[list_of_attributes])

但是当我运行它时,我得到一个“TypeError: unhashable type:'list'”错误。我还在学习 Python(显然我想)。我在网上环顾四周(找到this),如果没有明确说明我想打印什么键,我似乎无法弄清楚该怎么做......我不想单独列出每个......

感谢您的任何帮助/想法!如果我可以澄清或提供更多信息,请告诉我。

【问题讨论】:

    标签: python json csv


    【解决方案1】:

    您的TypeError 正在发生,因为您试图索引字典,x 带有列表,list_of_attributes 带有x[list_of_attributes]。这不是python的工作方式。在这种情况下,您正在迭代readable_json,它似乎会在每次迭代时返回一个字典。无需从这些数据中提取值来将它们写出来。

    DictWriter 应该能满足您的需求。

    import csv
    [...]
    
    def encode_dict(d, out_encoding="utf8"):    
        '''Encode dictionary to desired encoding, assumes incoming data in unicode'''
        encoded_d = {}
        for k, v in d.iteritems():
            k = k.encode(out_encoding)
            v = unicode(v).encode(out_encoding)        
            encoded_d[k] = v
        return encoded_d
    
    list_of_attributes = readable_json[0].keys()
    # sort fields in desired order
    list_of_attributes.sort()
    
    with open('WCData_Rows.csv',"wb+") as csv_out:
        writer = csv.DictWriter(csv_out, fieldnames=list_of_attributes)
        writer.writeheader()
        for data in readable_json:
            writer.writerow(encode_dict(data))
    

    注意: 这假定readable_json 中的每个条目都具有相同的字段。

    【讨论】:

    • 啊哈!我想就是这样 - 但是,我收到错误“UnicodeEncodeError:'ascii'编解码器无法在位置 6 中编码字符 u'\xe9':序数不在范围内(128)”。如果我没记错的话,那是因为玩家的名字中有重音,我必须让 Python 知道?我需要在某处使用类似 .encode('utf-8') 的东西吗?
    • 你知道JSON数据的编码吗?
    • 我不确定,但如果你不介意,你可以在这里查看 JSON 数据:kimonolabs.com/worldcup/explorer
    • 字符解码/编码很痛苦,如果您有兴趣,Joel 有一篇很好的文章。这应该工作......
    • 我很感兴趣,你有链接吗?
    【解决方案2】:

    也许pandas 可以做到这一点 - 但我最近尝试阅读 JSON

    import pandas as pd
    
    df = pd.read_json( ... )
    
    df.to_csv( ... )
    

    pandas.DataFrame.to_csv

    pandas.io.json.read_json


    编辑:

    data = ''' [
      {
        "firstName": "Nicolas Alexis Julio",
        "lastName": "N'Koulou N'Doubena",
        "nickname": "N. N'Koulou",
        "nationality": "Cameroon",
        "age": 24
      },
      {
        "firstName": "Alexandre Dimitri",
        "lastName": "Song-Billong",
        "nickname": "A. Song",
        "nationality": "Cameroon",
        "age": 26,
      }
    ]'''
    
    import pandas as pd
    
    df = pd.read_json(data)
    
    print df
    
    df.to_csv('results.csv')
    

    结果:

       age             firstName            lastName nationality     nickname
    0   24  Nicolas Alexis Julio  N'Koulou N'Doubena    Cameroon  N. N'Koulou
    1   26     Alexandre Dimitri        Song-Billong    Cameroon      A. Song
    

    使用pandas,您可以将其保存在csvexcel 等中(甚至可以直接保存在数据库中)。

    您可以对表格中的数据进行一些操作,并将其显示为图表。

    【讨论】:

    • 我安装了 Pandas,但在尝试上述操作时出现错误,“ImportError: No module named numpy”。
    • pandas有很多依赖,最好通过pip安装
    • 我无法使用 pip - 我遇到了一些错误......但这完全是另一个线程的问题。不过我会继续努力,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2017-07-29
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    相关资源
    最近更新 更多