115

これが私のコードです。本当に単純なものです...

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:コードの下でコードを実行しようとしましたが、ファイル全体を1行で実行し、ファイル全体を別の行でループします...行がなくなるまで続行しますreader = csv.DictReader( line, fieldnames).

これを修正するための提案はありますか?

編集:明確にするために、現在私は持っています:(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"
4

12 に答える 12

166

目的の出力の問題は、有効な 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')
于 2013-10-31T12:49:43.453 に答える
14
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)

json.dumps() のドキュメント

于 2018-01-06T19:58:46.033 に答える
12

@SingleNegationElimination の応答を受け取り、パイプラインで使用できる 3 つのライナーに単純化しました。

import csv
import json
import sys

for row in csv.DictReader(sys.stdin):
    json.dump(row, sys.stdout)
    sys.stdout.write('\n')
于 2015-11-25T22:25:17.383 に答える
4

これは古いようですが、SingleNegationElimination のコードが必要でしたが、utf-8 以外の文字を含むデータに問題がありました。これらは私があまり気にしていない分野に現れたので、無視することにしました。ただし、それには多少の努力が必要でした。私は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
于 2016-08-18T15:50:42.513 に答える
3

indentパラメータを追加しますjson.dumps

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

json.dumpまた、 open で簡単に使用できることにも注意してくださいjsonfile

json.dump(data, jsonfile)
于 2013-10-31T03:17:40.443 に答える
2

Pandas を使用して csv ファイルを DataFrame ( pd.read_csv ) に読み込み、必要に応じて列を操作 (ドロップまたは値の更新) し、最後に DataFrame を JSON に変換します ( pd.DataFrame.to_json )。

注:これがどれほど効率的であるかは確認していませんが、これは間違いなく、大きな csv を操作して json に変換する最も簡単な方法の 1 つです。

于 2016-07-07T17:10:20.380 に答える
0

@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)
于 2014-03-05T19:43:35.903 に答える
0
def read():
    noOfElem = 200  # no of data you want to import
    csv_file_name = "hashtag_donaldtrump.csv"  # csv file name
    json_file_name = "hashtag_donaldtrump.json"  # json file name

    with open(csv_file_name, mode='r') as csv_file:
        csv_reader = csv.DictReader(csv_file)
        with open(json_file_name, 'w') as json_file:
            i = 0
            json_file.write("[")
            
            for row in csv_reader:
                i = i + 1
                if i == noOfElem:
                    json_file.write("]")
                    return

                json_file.write(json.dumps(row))

                if i != noOfElem - 1:
                    json_file.write(",")

上記の 3 つのパラメーターを変更すると、すべてが完了します。

于 2021-01-21T18:40:36.897 に答える
-1
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)
于 2013-10-31T12:03:05.403 に答える