【问题标题】:csv to json with python, json in rowscsv到json与python,json在行
【发布时间】:2017-08-17 22:30:48
【问题描述】:

我想用 Python 将 CSV 转换为一组 JSON 对象,按行格式化。

我在下面尝试了这个脚本,将几个 SO 答案放在一起,但是这种格式是这样的:

{
   key:'value'
},
{
   key:'value'
} // etc

我想将其格式化为:

{ key, 'value'},
{ key, 'value'}, // etc

我尝试了这里建议的几种方法来插入换行符,但到目前为止都没有奏效。

下面的脚本:

import sys, getopt
import csv
import json


CSV_PATH = 'path/file.csv'
JSON_PATH = 'path/demo.json'

csv_file = csv.DictReader(open(CSV_PATH, 'r'))

json_list = []
for row in csv_file:
   json_list.append(row )

file(JSON_PATH, 'w').write(json.dumps(json_list, indent=4, separators=(' ,')  ))

我的 csv 很简单:

SUM_F   SUM_I   SUM_P   SUM_PI  SUM_Bt  SUM_BI  SUM_M   SUM_MI  Year    Month
15       3963     14      993    0      91      1      2879     2009       1

等等。

编辑:我在另一个 post 的 cmets 中收到了这个建议:

for x in json_list: print json.dumps(x)

这将打印我正在寻找的格式,但我还没有弄清楚如何将其写入 json 文件。

【问题讨论】:

  • 我会尝试,但我不知道如何模仿您的 file.csv 的内容,您介意发布一些示例行以显示其结构吗?
  • @downshift 我编辑了我的问题,很简单
  • 谢谢,你说得对,格式非常简单。尝试使用 separators=(' ,\n') 对我有用。
  • 如果我按照你的方式输入,我会收到“ValueError: too many values to unpack”消息..如果我将逗号和尾行放在引号中 (',', '\n') json 在每个字符串都有一个新行 @downshift
  • 我的错是的,你是对的,很抱歉没有注意到这一点,我使用了两个分隔符,换行符包含在逗号中,所以完整 file(JSON_PATH, 'w').write(json.dumps(json_list, separators=(' ,\n', ':') ))。我根据json docs 中的“注释”删除了indent 参数:“注意:由于默认项目分隔符是', ',因此在指定缩进 时输出可能包含尾随空格。您可以使用separators=(',', ': ') 来避免这种情况。”

标签: json python-2.7 csv format


【解决方案1】:
import csv
import json

CSV_PATH = 'file.csv'
JSON_PATH = 'demo.json'

with open(CSV_PATH, 'r') as csv_file:
    reader = csv.DictReader(csv_file)
    with open(JSON_PATH, 'w') as json_file:
        for row in reader:
            json_file.write(json.dumps(row) + '\n')

str(row) 给出了错误的引号,不要使用它。您将无法使用json 读取文件。

【讨论】:

  • 这没有给我任何输出。
  • 这工作谢谢。我确实需要在换行符之前插入一个逗号才能使我的 Web 代码正常工作,这会导致最后有一个额外的逗号,但它似乎没有任何影响。如果你愿意,你可以编辑我有这个评论的其他帖子。 @亚历克斯大厅
  • @JasonBK 我不知道你在你的网络代码中做了什么,但这听起来很奇怪。我只想删除另一个问题。
  • 我的网页代码并不奇怪,它非常简单,并且在格式正确的情况下运行良好..我之前使用过这个在线工具,它也以同样的方式格式化 JSONs shancarter.github.io/mr-data-converter
  • @JasonBK 您认为哪种格式与此代码相同?
【解决方案2】:

首先,CSV 文件的格式不正确,我不得不重新格式化 file.csv,使其看起来像:

SUM_F,SUM_I,SUM_P,SUM_PI,SUM_Bt,SUM_BI,SUM_M,SUM_MI,Year,Month
15,3963,14,993,0,91,1,2879,2009,1
3,4,5,6,0,971,1,8,9,10

为了使它工作 - 我不确定这是令牌之间的空格数不均匀还是其他原因。

其次,我修改了代码:

import sys, getopt
import csv
import json


CSV_PATH = '/path/file.csv'
JSON_PATH = '/path/demo.json'

csv_file = csv.DictReader(open(CSV_PATH, 'r'))

f = file(JSON_PATH, 'w')
for row in csv_file:
    f.write(str(row)+"\n")

结果(文件)如下所示:

{'SUM_I': '3963', 'SUM_M': '1', 'SUM_BI': '91', 'Month': '1', 'SUM_MI': '2879', 'SUM_F': '15', 'Year': '2009', 'SUM_Bt': '0', 'SUM_P': '14', 'SUM_PI': '993'}
{'SUM_I': '4', 'SUM_M': '1', 'SUM_BI': '971', 'Month': '10', 'SUM_MI': '8', 'SUM_F': '3', 'Year': '9', 'SUM_Bt': '0', 'SUM_P': '5', 'SUM_PI': '6'}

【讨论】:

  • 这适用于较小的 csv,但对于较大的 csv,它会创建一个格式错误的 JSON,由于某种原因它在一行中间结束..下面的答案似乎也适用于这些情况..但是我感谢@alfasin的答案
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2015-06-09
  • 2017-07-29
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多