Python CSV到JSON

这是我的代码,非常简单的东西…

import csv import json csvfile = open('file.csv', 'r') jsonfile = open('file.json', 'w') fieldnames = ("FirstName","LastName","IDNumber","Message") reader = csv.DictReader( csvfile, fieldnames) out = json.dumps( [ row for row in reader ] ) jsonfile.write(out) 

声明一些字段名称,阅读器使用CSV来读取文件,并将字段名称转储为JSON格式的文件。 这是问题…

CSV文件中的每条logging都在不同的行上。 我想要JSON输出是相同的方式。 问题是它把所有这一切都排在一条巨大的长线上。

我试过for line in csvfile:使用类似于for line in csvfile:然后在reader = csv.DictReader( line, fieldnames)下面运行我的代码reader = csv.DictReader( line, fieldnames)它循环遍历每一行,但它在一行上执行整个文件,然后遍历整个文件在另一行…继续,直到它用完行。

任何build议纠正这个?

编辑:澄清,目前我有:(第1行的每个logging)

 [{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}] 

我在找什么:(2条logging,共2行)

 {"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"} {"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"} 

不是每个单独的字段都在一行中缩进,而是在各自的行上缩进。

一些示例input。

 "John","Doe","001","Message1" "George","Washington","002","Message2" 

你想要的输出的问题是,它是无效的json文件,; 这是一个JSON文件stream

没关系,如果你需要的话,但是这意味着你要输出的每一个文件,你必须调用json.dumps

由于你想要分隔你的文档的换行符不包含在这些文档中,你可以自己提供。 所以我们只需要把这个循环从json.dump中调出来,并为每个写入的文档设置换行符。

 import csv import json csvfile = open('file.csv', 'r') jsonfile = open('file.json', 'w') fieldnames = ("FirstName","LastName","IDNumber","Message") reader = csv.DictReader( csvfile, fieldnames) for row in reader: json.dump(row, jsonfile) jsonfile.write('\n') 

你可以试试这个

 import csvmapper # how does the object look mapper = csvmapper.DictMapper([ [ { 'name' : 'FirstName'}, { 'name' : 'LastName' }, { 'name' : 'IDNumber', 'type':'int' }, { 'name' : 'Messages' } ] ]) # parser instance parser = csvmapper.CSVParser('sample.csv', mapper) # conversion service converter = csvmapper.JSONConverter(parser) print converter.doConvert(pretty=True) 

编辑:

更简单的方法

 import csvmapper fields = ('FirstName', 'LastName', 'IDNumber', 'Messages') parser = CSVParser('sample.csv', csvmapper.FieldMapper(fields)) converter = csvmapper.JSONConverter(parser) print converter.doConvert(pretty=True) 

我采取@ SingleNegationElimination的回应,并将其简化为可用于stream水线的三线程:

 import csv import json import sys for row in csv.DictReader(sys.stdin): json.dump(row, sys.stdout) sys.stdout.write('\n') 

indent参数添加到json.dumps

  data = {'this': ['has', 'some', 'things'], 'in': {'it': 'with', 'some': 'more'}} print(json.dumps(data, indent=4)) 

另外请注意,您可以简单地使用json.dump和打开的jsonfile

 json.dump(data, jsonfile) 

如何使用Pandas将csv文件读入DataFrame( pd.read_csv ),然后操纵列(如果需要)(删除它们或更新值),最后将DataFrame转换回JSON( pd.DataFrame.to_json )。

注意:我没有检查这将是多么高效,但这绝对是操纵和转换一个大的csv json的最简单的方法之一。

我看到这是旧的,但我需要来自SingleNegationElimination的代码,但我有数据包含非UTF – 8字符的问题。 这些出现在我不太在意的领域,所以我select忽略它们。 不过花了一些功夫。 我是新来的python所以一些试验和错误,我得到它的工作。 该代码是SingleNegationElimination的一个副本,并附加了utf-8的处理。 我试图用https://docs.python.org/2.7/library/csv.html,但最终放弃了。; 下面的代码工作。

 import csv, json csvfile = open('file.csv', 'r') jsonfile = open('file.json', 'w') fieldnames = ("Scope","Comment","OOS Code","In RMF","Code","Status","Name","Sub Code","CAT","LOB","Description","Owner","Manager","Platform Owner") reader = csv.DictReader(csvfile , fieldnames) code = '' for row in reader: try: print('+' + row['Code']) for key in row: row[key] = row[key].decode('utf-8', 'ignore').encode('utf-8') json.dump(row, jsonfile) jsonfile.write('\n') except: print('-' + row['Code']) raise 

作为@MONTYHS的轻微改进回答,迭代一个字段名称:

 import csv import json csvfilename = 'filename.csv' jsonfilename = csvfilename.split('.')[0] + '.json' csvfile = open(csvfilename, 'r') jsonfile = open(jsonfilename, 'w') reader = csv.DictReader(csvfile) fieldnames = ('FirstName', 'LastName', 'IDNumber', 'Message') output = [] for each in reader: row = {} for field in fieldnames: row[field] = each[field] output.append(row) json.dump(output, jsonfile, indent=2, sort_keys=True) 

您可以使用Pandas DataFrame来实现这一点,使用下面的示例:

 import pandas as pd csv_file = pd.DataFrame(pd.read_csv("path/to/file.csv", sep = ",", header = 0, index_col = False)) csv_file.to_json("/path/to/new/file.json", orient = "records", date_format = "epoch", double_precision = 10, force_ascii = True, date_unit = "ms", default_handler = None) 
 import csv import json csvfile = csv.DictReader('filename.csv', 'r')) output =[] for each in csvfile: row ={} row['FirstName'] = each['FirstName'] row['LastName'] = each['LastName'] row['IDNumber'] = each ['IDNumber'] row['Message'] = each['Message'] output.append(row) json.dump(output,open('filename.json','w'),indent=4,sort_keys=False)