【问题标题】:How to convert specific CSV format to JSON using Python如何使用 Python 将特定的 CSV 格式转换为 JSON
【发布时间】:2015-01-14 00:20:43
【问题描述】:

我从 Google 趋势下载了一个 CSV 文件,该文件以这种格式显示数据:

Top cities for golden globes
City,golden globes
New York (United States),100
Los Angeles (United States),91
Toronto (Canada),69

Top regions for golden globes
Region,golden globes
United States,100
Canada,91
Ireland,72
Australia,72

这些组中有 3-4 个由空格分隔。每组的第一行包含我想用作键的文本,然后是我需要与该键关联的字典列表。有人对我可以用来实现这一目标的一些 Python 工具有什么建议吗?我对 Python 的 CSV 库不太满意。

我想要的上述 CSV 输出如下所示:

{
"Top cities for golden globes" :
   {
      "New York (United States)" : 100,
      "Los Angeles (United States)" : 91,
      "Toronto (Canada)" : 69
   },
"Top regions for golden globes" :
   {
      "United States" : 100,
      "Canada" : 91,
      "Ireland" : 72,
      "Australia" : 72
   }
}

【问题讨论】:

  • 你想要的输出在我看来不像 JSON ;-) -- 例如{"New York (United States)", 100}
  • Python CSV to JSON 的可能重复项
  • 为不正确的格式道歉,请参阅编辑
  • @CollinSchupman,这是一次性任务吗?
  • @Anzel,不,这是动态过程的一部分。每天左右,系统都会为前 10 个热门词提取此信息并放入新的 JSON 格式

标签: python json csv google-trends


【解决方案1】:

您的输入格式非常符合预期,我会在没有 CSV 库的情况下手动完成。

import json
from collections import defaultdict

fh = open("yourfile.csv")
result = defaultdict(dict) #dictionary holding the data
current_key = "" #current category
ignore_next = False #flag to skip header

for line in fh:
    line = line.strip() #throw away newline
    if line == "": #line is empty
        current_key = ""
        continue
    if current_key == "": #current_key is empty
        current_key = line #so the current line is the header for the following data
        ignore_next = True
        continue
    if ignore_next: #we're in a line that can be ignored
        ignore_next = False
        continue
    (a,b) = line.split(",")
    result[current_key][a] = b
fh.close()

#pretty-print data
print json.dumps(result, sort_keys=True, indent=4)

【讨论】:

    【解决方案2】:

    我会尝试类似...:

    row = []
    dd = {}
    with open('the.csv') as f:
        r = csv.reader(f)
        while True:
            if row:  # normal case, non-empty row
                d[row[0]] = row[1]
                row = next(r, None)
                if row is None: break
            else:  # row is empty at start and after blank line
                category = next(f, None)
                if category is None: break
                category = category.strip()
                next(r)  # skip headers row
                d = dd[category] = {}
                row = next(r, None)
                if row is None: break
    

    现在,dd 应该是您想要的 dict-of-dicts,您可以随意使用 json.dump

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2020-11-06
      • 2019-02-01
      • 2022-01-19
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多