ここに私のコード、本当にシンプルなものがあります...
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ファイルの各レコードは異なる行にあります。 JSON出力も同じようにしたいです。問題は、1つの巨大な長い行にすべてをダンプすることです。
私はfor line in csvfile:
のようなものを使用してから、その下のコードを各行をループするreader = csv.DictReader( line, fieldnames)
で実行しようとしましたが、ファイル全体を1行で実行し、次にファイル全体を別の行でループします...行の。
これを修正するための提案はありますか?
編集:明確にするために、現在私は以下を持っています:(1行目のすべてのレコード)
[{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"},{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}]
探しているもの:(2行に2レコード)
{"FirstName":"John","LastName":"Doe","IDNumber":"123","Message":"None"}
{"FirstName":"George","LastName":"Washington","IDNumber":"001","Message":"Something"}
個々のフィールドがインデントされている/個別の行にあるのではなく、その行の各レコードが独自の行になっています。
サンプル入力。
"John","Doe","001","Message1"
"George","Washington","002","Message2"
目的の出力の問題は、有効なjsonドキュメントではないことです。 jsonドキュメントのストリーム!
必要な場合は問題ありませんが、出力に必要なドキュメントごとに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')
次の例では、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)
@SingleNegationEliminationの応答を取得し、パイプラインで使用できる3ライナーに単純化しました。
import csv
import json
import sys
for row in csv.DictReader(sys.stdin):
json.dump(row, sys.stdout)
sys.stdout.write('\n')
this を試すことができます
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)
import csv
import json
file = 'csv_file_name.csv'
json_file = 'output_file_name.json'
#Read CSV File
def read_CSV(file, json_file):
csv_rows = []
with open(file) as csvfile:
reader = csv.DictReader(csvfile)
field = reader.fieldnames
for row in reader:
csv_rows.extend([{field[i]:row[field[i]] for i in range(len(field))}])
convert_write_json(csv_rows, json_file)
#Convert csv data into json
def convert_write_json(data, json_file):
with open(json_file, "w") as f:
f.write(json.dumps(data, sort_keys=False, indent=4, separators=(',', ': '))) #for pretty
f.write(json.dumps(data))
read_CSV(file,json_file)
indent
パラメーターをjson.dumps
に追加します
data = {'this': ['has', 'some', 'things'],
'in': {'it': 'with', 'some': 'more'}}
print(json.dumps(data, indent=4))
また、開いているjsonfile
でjson.dump
を使用するだけでよいことに注意してください。
json.dump(data, jsonfile)
Pandasを使用してcsvファイルをDataFrameに読み込み( pd.read_csv )、必要に応じて列を操作(ドロップまたは値を更新)し、最後にDataFrameを変換する方法JSONに戻る( pd.DataFrame.to_json )。
注:これがどれほど効率的かは確認していませんが、これは間違いなく大きなcsvをjsonに操作および変換する最も簡単な方法の1つです。
これは古いようですが、SingleNegationEliminationのコードが必要でしたが、utf-8以外の文字を含むデータに問題がありました。これらは私があまり気にしていない分野に現れたので、無視することにしました。しかし、それには多少の努力が必要でした。私はpythonが初めてなので、試行錯誤を繰り返して動作するようになりました。コードは、utf-8を追加処理したSingleNegationEliminationのコピーです。 https://docs.python.org/2.7/library/csv.html でやろうとしましたが、最終的にはgaveめました。以下のコードが機能しました。
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)