在Python中将CSV转换为Json

在Python中将CSV转换为Json,python,json,csv,Python,Json,Csv,我有一个四列的excel电子表格(另存为csv文件)。第一列和第三列包含单词,第二列和第四列包含频率。看起来是这样的: word1, freq1, word2, freq2 word3, freq3, word4, freq4 feature, r, feature, r word1, freq1, word2, freq2 word3, freq3, word4, freq4 ……等等 我有以下代码将csv转换为json文件 import csv import json csvfile

我有一个四列的excel电子表格(另存为csv文件)。第一列和第三列包含单词,第二列和第四列包含频率。看起来是这样的:

word1, freq1, word2, freq2
word3, freq3, word4, freq4
feature, r, feature, r
word1, freq1, word2, freq2
word3, freq3, word4, freq4
……等等

我有以下代码将csv转换为json文件

import csv
import json

csvfile = open('sample.csv', 'r')
jsonfile = open('sample.json', 'w')


fieldnames = ("feature","r", "feature","r")
reader = csv.DictReader(csvfile, fieldnames)
out = json.dumps( [ row for row in reader ] )
jsonfile.write(out)
非常简单的东西。 但是,这将返回一个json文件,如下所示

[{"r" : freq2 "feature" : "word2"} {"r" : freq1 "feature" : "word1"}{"r" : freq4 "feature" : "word4"}{"r" : freq3 "feature" : "word3"}]
我试图找出一种方法,使返回的json文件看起来像这样

[{"word1" : freq1}{"word2" :freq2}{"word3" :freq3}{"word4" :freq4}]

换句话说,我想让我的电子表格的第1列成为第2列的键,第3列成为第4列的键。

不幸的是,python的DictReader并不适合您的用例,但是一点
zip
魔法就可以了

import csv, json

csvfile = open('sample.csv', 'r')
jsonfile = open('sample.json', 'w')

fieldnames = ("word1","freq1", "word2","freq2")
reader = csv.reader(csvfile, fieldnames)

out = json.dumps( [ dict(zip(row[::2], row[1::2])) for row in reader ] )
jsonfile.write(out)

dict(zip(行[::2],行[1::2])
创建一个字典,该字典可以从一行的奇数列映射到相应的偶数列。

稍微有点罗嗦,但您能尝试一下吗

import csv, json

def dump_to_json():                     
    csv_result = []
    with open('sample.csv', 'rb') as csvfile:                
        for row in csv.DictReader(csvfile, delimiter=',', quotechar='"'):
            csv_result.append({'word1': row['word1'], 'freq1': row['freq1'], 
                               'word2': row['word2'], 'freq2': row['freq2']})        

    json_feed = [{c['word1']: c['freq1'], c['word2']: c['freq2']} for c in csv_result]

    with open('sample.json', 'w') as outfile:
        json.dump(json_feed, outfile)       

dump_to_json()              

假设您有如下数据:

word1, freq1, word2, freq2
word3, freq3, word4, freq4
feature, r, feature, r
word1, freq1, word2, freq2
word3, freq3, word4, freq4
如果允许我使用自己的库,下面是一个图解解决方案:

>>> import pyexcel
>>> r=pyexcel.SeriesReader("sample.csv")
>>> r[0]
['word1', ' freq1', ' word2', ' freq2']
>>> r[1]
['word3', ' freq3', ' word4', ' freq4']
>>> r.series()
['feature', ' r', ' feature', ' r']
>>> r.column_at(0)
['word1', 'word3']
>>> r.column_at(1)
[' freq1', ' freq3']
>>> r.column_at(2)
[' word2', ' word4']
>>> r.column_at(3)
[' freq2', ' freq4']
>>> a=zip(r.column_at(0),r.column_at(1))
>>> b=zip(r.column_at(2),r.column_at(3))
>>> a+b
[('word1', ' freq1'), ('word3', ' freq3'), (' word2', ' freq2'), (' word4', ' freq4')]
>>> j=open('sample.json', 'w')
>>> import json
>>> j.write(json.dumps(a+b))
>>> j.close()
>>> exit()
结果如下:

[["word1", " freq1"], ["word3", " freq3"], [" word2", " freq2"], [" word4", " freq4"]]
正如你所看到的,引号中还有空格。因此,您可以使用SheetFormatter:

>>> import pyexcel
>>> r=pyexcel.SeriesReader("sample.csv")
>>> def clean(value, type):
...     return value.strip()
...
>>> r.add_formatter(pyexcel.formatters.SheetFormatter(str, clean))
>>> r.column_at(0)
['word1', 'word3']
>>> r.column_at(1)
['freq1', 'freq3']
>>> r.column_at(2)
['word2', 'word4']
>>> r.column_at(3)
['freq2', 'freq4']
更多文档在

尝试使用


不导入到的解决方案在PYTHON中将CSV转换为JSON

我确信json和csv库工作得很好,但我最终没有它们。也许这对其他人来说很方便

简而言之:这将从CSV中提取数据并构建JSON字符串

笨拙,但有效

#set up paths and vars
csvfile = open('input.csv','r')
jsonfile = open('output.json', 'w')
arr=[]
headers = []

# Read in the headers/first row
for header in csvfile.readline().split(','):
    headers.append(header)

# Extract the information into the "xx" : "yy" format.
for line in csvfile.readlines():  
  lineStr = ''
  for i,item in enumerate(line.split(',')):
    if i < 28:  #I skip the last two columns for my application
        lineStr+='"'+headers[i] +'" : "' + item + '",\n'
  arr.append(lineStr)

csvfile.close()

#convert the array into a JSON string:
jsn = '{\n "entries":['
jsnEnd = ']\n}'
for i in range(len(arr)-1):
    if i == len(arr)-2:
        jsn+="{"+str(arr[i])[:-2]+"}\n" #Get rid of the last comma if last entry
    else:
        jsn+="{"+str(arr[i])[:-2]+"},\n" #Get rid of the last comma
jsn+=jsnEnd

#write to file
jsonfile.write(jsn)
jsonfile.close()
print "Done."
#设置路径和变量
csvfile=open('input.csv','r')
jsonfile=open('output.json','w')
arr=[]
标题=[]
#读入标题/第一行
对于csvfile.readline().split(',')中的标头:
headers.append(头)
#将信息提取为“xx”:“yy”格式。
对于csvfile.readlines()中的行:
lineStr=''
对于i,枚举中的项(行分割(','):
如果我<28:#我会跳过申请表的最后两列
lineStr+=''“'+标题[i]+':“'+项目+”,\n'
arr.append(lineStr)
csvfile.close()
#将数组转换为JSON字符串:
jsn='{\n“条目”:['
jsnEnd=']\n}'
对于范围内的i(len(arr)-1):
如果i==len(arr)-2:
jsn+=“{”+str(arr[i])[:-2]+“}\n”#如果最后一个条目
其他:
jsn+=“{”+str(arr[i])[:-2]+“},\n”#去掉最后一个逗号
jsn+=jsnEnd
#写入文件
jsonfile.write(jsn)
jsonfile.close()
打印“完成”

为其他可能需要这样一个脚本的人添加更多的参考信息。

当我运行它时,它告诉我行“out=json.dumps([dict(zip(row[::2],row[1::2])用于reader中的row])”有“TypeError:unhable type”unhable类型列表?你能给我一个复制错误的示例csv行吗?使用
a,0,b,1
作为我在
sample.csv
中的输入,我在
sample.json中得到
[{“a”:“0”,“b”:“1”}]
的输出。csv文件存储在excel中。看起来是这样的,我仍然得到有效的输出。查看是否可以使用excel以外的工具(记事本/升华等)打开csv并发布原始文件数据。我很确定这是一个格式错误,如果没有看到准确的输入,很难找到它。补充了一些说明。我做到了。但是,它没有返回任何文件:/I我也没有收到任何错误。您在python代码中调用了dump_to_json()方法吗?没有。我认为json.dump(json_提要,outfile)就足够了。如果我要添加那一行,代码的确切位置在哪里?我已经编辑了答案,包括导入和调用函数。mhm我得到了“KeyError:word1”。我可能应该指定这一点(已经编辑了我的文章)。csv文件包含4列,每列有30多个条目。我想使用第一列和第三列作为键,将第二列中的数据映射到第一列,将第四列映射到第三列。