আমি কীভাবে JSON কে CSV তে রূপান্তর করতে পারি?


183

আমার কাছে একটি JSON ফাইল আছে আমি একটি সিএসভি ফাইলে রূপান্তর করতে চাই। পাইথন দিয়ে আমি কীভাবে এটি করতে পারি?

আমি চেষ্টা করেছিলাম:

import json
import csv

f = open('data.json')
data = json.load(f)
f.close()

f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
    csv_file.writerow(item)

f.close()

তবে এটি কার্যকর হয়নি। আমি জ্যাঙ্গো ব্যবহার করছি এবং আমার প্রাপ্ত ত্রুটিটি হ'ল:

file' object has no attribute 'writerow'

আমি তখন নিম্নলিখিতটি চেষ্টা করেছিলাম:

import json
import csv

f = open('data.json')
data = json.load(f)
f.close()

f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
    f.writerow(item)  # ← changed

f.close()

আমি তখন ত্রুটি পেয়েছি:

sequence expected

নমুনা জেসন ফাইল:

[{
        "pk": 22,
        "model": "auth.permission",
        "fields": {
            "codename": "add_logentry",
            "name": "Can add log entry",
            "content_type": 8
        }
    }, {
        "pk": 23,
        "model": "auth.permission",
        "fields": {
            "codename": "change_logentry",
            "name": "Can change log entry",
            "content_type": 8
        }
    }, {
        "pk": 24,
        "model": "auth.permission",
        "fields": {
            "codename": "delete_logentry",
            "name": "Can delete log entry",
            "content_type": 8
        }
    }, {
        "pk": 4,
        "model": "auth.permission",
        "fields": {
            "codename": "add_group",
            "name": "Can add group",
            "content_type": 2
        }
    }, {
        "pk": 10,
        "model": "auth.permission",
        "fields": {
            "codename": "add_message",
            "name": "Can add message",
            "content_type": 4
        }
    }
]

1
csv_file.writerow (আইটেম) আইটেমটি স্ট্রিং বা সংখ্যার একটি সহজ তালিকা হতে হবে। J "pk": 22, "মডেল": "auth.permission" like এর মতো প্রতিটি জেসন বস্তুকে ফ্ল্যাট তালিকায় রূপান্তর করার চেষ্টা করুন [22, auth.permission]।
দমনফায়ার

1
jqএখানে বর্ণিত হিসাবে এটির
এলিয়ট

তৃতীয় পক্ষের বিকল্প: পাইথনের সাথে স্বয়ংক্রিয় করতে json-csv.com (এক-অফ রূপান্তরগুলির জন্য) বা json-csv.com/api । এটি আরও জটিল JSON কাঠামোর জন্য একটি সহজ সমাধান।
স্ট্যাক ম্যান

উত্তর:


128

প্রথমত, আপনার জেএসএন-তে নেস্টেড অবজেক্ট রয়েছে, তাই এটি সাধারণত সিএসভিতে রূপান্তর করা যায় না। আপনার এটির মতো কিছুতে পরিবর্তন করতে হবে:

{
    "pk": 22,
    "model": "auth.permission",
    "codename": "add_logentry",
    "content_type": 8,
    "name": "Can add log entry"
},
......]

সেখান থেকে সিএসভি উত্পন্ন করার জন্য আমার কোডটি এখানে:

import csv
import json

x = """[
    {
        "pk": 22,
        "model": "auth.permission",
        "fields": {
            "codename": "add_logentry",
            "name": "Can add log entry",
            "content_type": 8
        }
    },
    {
        "pk": 23,
        "model": "auth.permission",
        "fields": {
            "codename": "change_logentry",
            "name": "Can change log entry",
            "content_type": 8
        }
    },
    {
        "pk": 24,
        "model": "auth.permission",
        "fields": {
            "codename": "delete_logentry",
            "name": "Can delete log entry",
            "content_type": 8
        }
    }
]"""

x = json.loads(x)

f = csv.writer(open("test.csv", "wb+"))

# Write CSV Header, If you dont need that, remove this line
f.writerow(["pk", "model", "codename", "name", "content_type"])

for x in x:
    f.writerow([x["pk"],
                x["model"],
                x["fields"]["codename"],
                x["fields"]["name"],
                x["fields"]["content_type"]])

আপনি আউটপুট হিসাবে পাবেন:

pk,model,codename,name,content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8

2
এটি একটি কাজ তবে দুঃখিত এর আগে আমি এমন কিছু পেতে পারি যা হার্ড কোড নয় আমি এটি আরও ভাল আইডি ব্যবহার করতে পারি যে আমি f.writerow (ক) ব্যবহার করতে পারি এবং একটিটি এমন কিছু ভেরিয়েবেল যা আমি ধন্যবাদ
জানার

আমার জন্য এটি প্রায় নিখুঁতভাবে কাজ করে। রফতানি হওয়া সিএসভিতে কিছু ক্ষেত্র ঘিরে রয়েছে [u'এবং ']। (পোস্ট-প্রসেসিং) ওয়ার্কআউন্ড কি? যদি সেখানে এক ... :)
Dror

3
নীচে আমি এটি হার্ড-কোড না করেই আরও সাধারণভাবে করার উপায় দেখিয়েছি
অ্যালেক ম্যাকগেইল

4
হেই, আমি এই চেষ্টা করেছি কিন্তু আমি পেয়ে করছি TypeError: a bytes-like object is required, not 'str'f.writerow(['pk', 'model', 'codename', 'name', 'content_type'])
আদিত্য হরিহরন

8
সিটিভি ফাইল খোলার সাথে পাইথন 3 পরিবর্তনের রেখার জন্যf = csv.writer(open("test.csv", "w", newline=''))
পাইওট্রিক

116

সঙ্গে pandas গ্রন্থাগার , এই দুই কমান্ড ব্যবহার হিসাবে হিসাবে সহজ!

pandas.read_json()

একটি JSON স্ট্রিংকে পান্ডাস অবজেক্টে রূপান্তর করতে (একটি সিরিজ বা ডেটাফ্রেম)। তারপরে, ধরে নিলাম ফলাফলগুলি সংরক্ষণ করা হয়েছিল df:

df.to_csv()

যা হয় স্ট্রিং ফিরিয়ে দিতে পারে বা সরাসরি সিএসভি-ফাইলে লিখতে পারে।

পূর্ববর্তী উত্তরের ভার্বোসটির ভিত্তিতে, আমাদের সকলকে শর্টকাটের জন্য পান্ডাদের ধন্যবাদ দেওয়া উচিত।


1
এটি একটি দুর্দান্ত উত্তর (+1) - এত সহজ এবং .to_csv()সত্যই শক্তিশালী (উদাহরণস্বরূপ কলাম ফিল্টারিং ফ্রি)। আমার পান্ডা শিখতে হবে।
ওউজে

3
হিসাবে চিহ্নিত হয়েছে, এই উত্তর এই প্রশ্নের ডেটা জন্য কাজ করে না। orient='records'অবশ্যই সেট করতে হবে, তবে প্রতিটি সারি fieldsএখনও একটি হবে dict, যা ওপি অনুরোধ করে না।
ট্রেনটন ম্যাককিনি

89

আমি ধরে নিচ্ছি যে আপনার JSON ফাইলটি অভিধানের তালিকায় ডিকোড হবে। প্রথমে আমাদের একটি ফাংশন প্রয়োজন যা জেএসএন বিষয়গুলিকে সমতল করবে:

def flattenjson( b, delim ):
    val = {}
    for i in b.keys():
        if isinstance( b[i], dict ):
            get = flattenjson( b[i], delim )
            for j in get.keys():
                val[ i + delim + j ] = get[j]
        else:
            val[i] = b[i]

    return val

আপনার JSON অবজেক্টে এই স্নিপেট চালানোর ফলাফল:

flattenjson( {
    "pk": 22, 
    "model": "auth.permission", 
    "fields": {
      "codename": "add_message", 
      "name": "Can add message", 
      "content_type": 8
    }
  }, "__" )

হয়

{
    "pk": 22, 
    "model": "auth.permission', 
    "fields__codename": "add_message", 
    "fields__name": "Can add message", 
    "fields__content_type": 8
}

JSON অবজেক্টগুলির ইনপুট অ্যারেতে প্রতিটি ডিককে এই ফাংশনটি প্রয়োগ করার পরে:

input = map( lambda x: flattenjson( x, "__" ), input )

এবং সম্পর্কিত কলামের নামগুলি সন্ধান করুন:

columns = [ x for row in input for x in row.keys() ]
columns = list( set( columns ) )

সিএসভি মডিউলটির মাধ্যমে এটি চালানো কঠিন নয়:

with open( fname, 'wb' ) as out_file:
    csv_w = csv.writer( out_file )
    csv_w.writerow( columns )

    for i_r in input:
        csv_w.writerow( map( lambda x: i_r.get( x, "" ), columns ) )

আশা করি এটা কাজে লাগবে!


পাইথন ৩.6 ব্যবহার করে, শেষ লুপটি কাজ করতে আমাকে সমতল জেএসওনের একটি তালিকা তৈরি করতে হয়েছিল: "ইনপুট = তালিকা (মানচিত্র (ল্যাম্বডা এক্স: ফ্ল্যাটেনজসন (এক্স," __ "), ইনপুট))"। যদিও বোঝা যাচ্ছে না কেন পুনরাবৃত্তিযোগ্য যথেষ্ট নয়। আমার ডেটা ইউটিএফ 8 ব্যবহার করে আউটপুট ফাইলটি খোলার সময় আমাকে এনকোডিংও নির্দিষ্ট করতে হয়েছিল। এটি অবশ্যই সাহায্য করেছে, আপনাকে ধন্যবাদ !!
অ্যালেক্সিস আর

এটি দুর্দান্ত, ধন্যবাদ আলেক! আমি এটা কাজ রুপান্তরিত করা পাখির একাধিক মাত্রা সঙ্গে stackoverflow.com/a/57228641/473201
phreakhead

35

জেএসএন বিভিন্ন ধরণের ডেটা স্ট্রাকচারের প্রতিনিধিত্ব করতে পারে - একটি জেএস "অবজেক্ট" মোটামুটি পাইথন ডিকের মতো (স্ট্রিং কীগুলির সাথে), জেএস "অ্যারে" মোটামুটি পাইথনের তালিকার মতো এবং আপনি এগুলিকে চূড়ান্ত হিসাবে দীর্ঘস্থায়ী করতে পারেন " পাতার "উপাদানগুলি সংখ্যা বা স্ট্রিং।

সিএসভি মূলত কেবলমাত্র একটি 2-ডি টেবিল উপস্থাপন করতে পারে - allyচ্ছিকভাবে "শিরোনাম" এর প্রথম সারিতে অর্থাত্ "কলামের নামগুলি", যা সাধারণ ব্যাখ্যার পরিবর্তে টেবিলটিকে ডিক্টের একটি তালিকা হিসাবে ব্যাখ্যাযোগ্য করে তুলতে পারে তালিকা (আবার, "পাতাগুলি" উপাদানগুলি সংখ্যা বা স্ট্রিং হতে পারে)।

সুতরাং, সাধারণ ক্ষেত্রে, আপনি একটি স্বেচ্ছাসেবী JSON কাঠামো কোনও সিএসভিতে অনুবাদ করতে পারবেন না। কয়েকটি বিশেষ ক্ষেত্রে আপনি (আর কোনও নেস্টিংয়ের সাথে অ্যারের অ্যারে; অবজেক্টগুলির অ্যারে যা সবগুলি একই হ'ল) ​​have কোন বিশেষ ক্ষেত্রে, যদি থাকে তবে আপনার সমস্যার জন্য প্রযোজ্য? সমাধানের বিবরণ নির্ভর করে আপনার কোন বিশেষ ক্ষেত্রে কী আছে। বিস্ময়কর সত্য যে আপনি কোনটি প্রযোজ্য তা উল্লেখ করার পরেও, আমি সন্দেহ করি আপনি সম্ভবত এই সীমাবদ্ধতা বিবেচনা করেন নি, বাস্তবে ব্যবহারযোগ্য কেসও প্রযোজ্য নয় এবং আপনার সমস্যার সমাধান করা অসম্ভব। তবে দয়া করে স্পষ্ট করুন!


31

একটি সাধারণ সমাধান যা ফ্ল্যাটের যে কোনও জসন তালিকার অনুবাদ করে অবজেক্টের যে ।

ইনপুট.জসন ফাইলটি কমান্ড লাইনে প্রথম যুক্তি হিসাবে পাস করুন।

import csv, json, sys

input = open(sys.argv[1])
data = json.load(input)
input.close()

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for row in data:
    output.writerow(row.values())

2
একটি গুরুত্বপূর্ণ মন্তব্য - এই কোডটি খুব প্রথম সারিতে ক্ষেত্রগুলি থেকে কলামগুলি / শিরোনামগুলিকে অনুমান করে। যদি আপনার জসন ডেটাতে 'জাগড' কলাম রয়েছে, অর্থাৎ ধরুন যে রাউ 1 এ 5 টি কলাম রয়েছে তবে সারি 2-এর 6 টি কলাম রয়েছে, তবে আপনাকে সমস্ত কলামের মোট সেট পেতে ডেটা ধরে একটি প্রথম পাস করতে হবে এবং এটি শিরোনাম হিসাবে ব্যবহার করতে হবে।
মাইকে

আমার যে ডেটা ছিল তা দিয়ে আমার প্রয়োজনীয় সমাধানের একটি দুর্দান্ত অংশ ছিল, যেহেতু আমার জেএসওন জ্যাগড হয়নি এটি আউটপুটটির জন্য কিছুটা সামঞ্জস্যের সাথে আশ্চর্যরূপে কাজ করেছে যেহেতু আমি এটি কোনও বিদ্যমান স্ক্রিপ্টের মধ্যে চালাচ্ছি।
মাইকেলএফএফ

1
এই কোডটি ধরেও নিয়েছে যে মানগুলি শিরোনাম সারিটির কীগুলির মতো একই ক্রমে আউটপুট হবে। যদিও এটি ভাগ্য দ্বারা কাজ করেছে, এটি কোনওভাবেই গ্যারান্টিযুক্ত নয়।
রায়ানহেনিগ

এনকোডিংয়ের ত্রুটি পাওয়া যাচ্ছে। কীভাবে কোনও ধারণা কীভাবে utf-8 এ এনকোডিং যুক্ত করবেন?
এলাদ তাবাক

25

এই কোডটি আপনার জন্য কাজ করে নেওয়া উচিত, ধরে নিবেন যে আপনার JSON ডেটা কল করা কোনও ফাইলে আছে data.json

import json
import csv

with open("data.json") as file:
    data = json.load(file)

with open("data.csv", "w") as file:
    csv_file = csv.writer(file)
    for item in data:
        fields = list(item['fields'].values())
        csv_file.writerow([item['pk'], item['model']] + fields)

1
হুঁ, না - csv_file.writerow( f.writerowঅবশ্যই নেই, আমি ধরে নিয়েছি আপনি সেখানে একটি টাইপো তৈরি করেছেন!) একটি সিক্যুয়েন্স চায়, ডিক নয় - এবং আপনার উদাহরণে প্রতিটি আইটেমই ডিক হয়। এটি অন্য বিশেষ ক্ষেত্রে কাজ করবে, যেমনটি আমি আমার উত্তরে চিহ্নিত করেছি - যেখানে JSON ফাইলটিতে অ্যারে রয়েছে; এটি কোনও অ্যারের অবজেক্টের জন্য কাজ করে না, এটি হ'ল বিশেষ ক্ষেত্রে যা আপনি সমাধান করার চেষ্টা করছেন বলে মনে হচ্ছে (যেটির ক্ষেত্রে একটি প্রয়োজন csv.DictWriter- এবং অবশ্যই আপনাকে ক্ষেত্রের নামগুলি বের করতে হবে এবং এটি ইনস্ট্যান্ট করার জন্য কোনও আদেশের সিদ্ধান্ত নিতে হবে) -)।
অ্যালেক্স মার্টেলি

@ ড্যানলয়েউনেহার্জ এটি সাম্প্রতিক পাইথনের সংস্করণগুলিতে কাজ করে না। প্রকারের ত্রুটি: কেবলমাত্র তালিকাতে ("ডিক্ট_ভ্যালু" নয়) তালিকাবদ্ধ করতে পারে
অ্যাপোলো রেডোমার

18

এটি ব্যবহার করা সহজ হবে csv.DictWriter(), বিস্তারিত বাস্তবায়ন এরকম হতে পারে:

def read_json(filename):
    return json.loads(open(filename).read())
def write_csv(data,filename):
    with open(filename, 'w+') as outf:
        writer = csv.DictWriter(outf, data[0].keys())
        writer.writeheader()
        for row in data:
            writer.writerow(row)
# implement
write_csv(read_json('test.json'), 'output.csv')

নোট করুন যে এটি ধরে নিয়েছে যে আপনার সমস্ত JSON অবজেক্টের একই ক্ষেত্র রয়েছে।

এখানে রেফারেন্স যা আপনাকে সাহায্য করতে পারে is


যদিও এই লিঙ্কটি প্রশ্নের উত্তর দিতে পারে, উত্তরের প্রয়োজনীয় অংশগুলি এখানে অন্তর্ভুক্ত করা এবং রেফারেন্সের জন্য লিঙ্কটি সরবরাহ করা ভাল। লিঙ্কযুক্ত পৃষ্ঠাগুলি পরিবর্তিত হলে লিঙ্ক-শুধুমাত্র উত্তরগুলি অবৈধ হতে পারে। - পর্যালোচনা থেকে
ম্যাথিউ

3
@পুরল্পসাইকো আমি এই উত্তরটি একটি ডাউনভোটের সাথে পেয়েছি, যা কেবল লিঙ্ক হওয়ার জন্য প্রাপ্য ছিল। নতুন ব্যবহারকারী, যিনি হয়ত সেই লিঙ্কটি সম্পর্কে অবগত নন, এটি একটি ভাল উত্তর নয়, সেটিকে সংশোধন করেছে। আমি upvated; নতুন ব্যবহারকারীকে আমাদের সম্প্রদায়ে অংশ নেওয়া চালিয়ে যেতে উত্সাহিত করার জন্য আপনি সম্ভবত তা করতে পারেন?
মাওগ বলছেন মনিকা

6

ড্যানের প্রস্তাবিত সমাধানটি নিয়ে আমি সমস্যায় পড়ছিলাম , তবে এটি আমার পক্ষে কাজ করেছে:

import json
import csv 

f = open('test.json')
data = json.load(f)
f.close()

f=csv.writer(open('test.csv','wb+'))

for item in data:
  f.writerow([item['pk'], item['model']] + item['fields'].values())

যেখানে "test.json" এ নিম্নলিখিতটি রয়েছে:

[ 
{"pk": 22, "model": "auth.permission", "fields": 
  {"codename": "add_logentry", "name": "Can add log entry", "content_type": 8 } }, 
{"pk": 23, "model": "auth.permission", "fields": 
  {"codename": "change_logentry", "name": "Can change log entry", "content_type": 8 } }, {"pk": 24, "model": "auth.permission", "fields": 
  {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 8 } }
]

আপনার নমুনা ডেটাতে আপনার প্রোগ্রামটি চেষ্টা করার সময় ত্রুটি পেয়েছে সি: l কার্ল> পাইথন জসন 2 সিএস.পি ট্র্যাসব্যাক (সর্বশেষতম কলটি শেষ): "মডেল> f.writerow ([আইটেম ['পিকে '], আইটেম [' মডেল ']] + আইটেম [' ক্ষেত্র ']। মান ()) প্রকারের ত্রুটি: কেবল তালিকাটি ("ডিক্ট_ভ্যালু" নয়) তালিকাবদ্ধ করতে পারে
মিয়া আসবাত আহমদ

পাইথন ২.7.৯ এ ঠিক আবার চেষ্টা করেছিলাম এবং এটি আমার পক্ষে ভাল কাজ করে।
আমন্ডা

6

json_normalizeথেকে ব্যবহার করুন pandas:

  • প্রদত্ত ডেটা দেওয়া হয়েছে, নামের একটি ফাইলে test.json
  • encoding='utf-8' প্রয়োজন হতে পারে না।
  • নিম্নলিখিত কোডটি pathlibগ্রন্থাগারের সুবিধা গ্রহণ করে
    • .open একটি পদ্ধতি pathlib
    • উইন্ডোজবিহীন পথগুলির সাথেও কাজ করে
import pandas as pd
# As of Pandas 1.01, json_normalize as pandas.io.json.json_normalize is deprecated and is now exposed in the top-level namespace.
# from pandas.io.json import json_normalize
from pathlib import Path
import json

# set path to file
p = Path(r'c:\some_path_to_file\test.json')

# read json
with p.open('r', encoding='utf-8') as f:
    data = json.loads(f.read())

# create dataframe
df = pd.json_normalize(data)

# dataframe view
 pk            model  fields.codename           fields.name  fields.content_type
 22  auth.permission     add_logentry     Can add log entry                    8
 23  auth.permission  change_logentry  Can change log entry                    8
 24  auth.permission  delete_logentry  Can delete log entry                    8
  4  auth.permission        add_group         Can add group                    2
 10  auth.permission      add_message       Can add message                    4

# save to csv
df.to_csv('test.csv', index=False, encoding='utf-8')

সিএসভি আউটপুট:

pk,model,fields.codename,fields.name,fields.content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8
4,auth.permission,add_group,Can add group,2
10,auth.permission,add_message,Can add message,4

আরও ভারী নেস্টেড জেএসএন বস্তুর জন্য অন্যান্য সংস্থানগুলি:


4

পূর্ববর্তী উত্তরে উল্লিখিত হিসাবে জসনকে সিএসভিতে রূপান্তর করতে অসুবিধা হ'ল কারণ একটি জেসন ফাইলটিতে নেস্টেড ডিকশনারি থাকতে পারে এবং তাই একটি বহুমাত্রিক ডেটা স্ট্রাকচারের আয়াত একটি সিএসভি হতে পারে যা একটি 2D ডেটা স্ট্রাকচার। তবে, বহুমাত্রিক কাঠামোটিকে সিএসভিতে পরিণত করার একটি ভাল উপায় হ'ল একাধিক সিএসভি রয়েছে যা প্রাথমিক কীগুলির সাথে একত্রে আবদ্ধ হয়।

আপনার উদাহরণে, প্রথম সিএসভি আউটপুটটিতে আপনার কলাম হিসাবে "pk", "মডেল", "ক্ষেত্রগুলি" রয়েছে। "পিকে", এবং "মডেল" এর মানগুলি পাওয়া সহজ তবে "ক্ষেত্রগুলি" কলামটিতে একটি অভিধান রয়েছে তাই এটির নিজস্ব সিএসভি হওয়া উচিত এবং কারণ "কোডনাম" প্রাথমিক কী হিসাবে উপস্থিত হয়, আপনি ইনপুট হিসাবে ব্যবহার করতে পারেন "ফিল্ডস" এর জন্য প্রথম সিএসভি সম্পূর্ণ করতে। দ্বিতীয় সিএসভিতে প্রাথমিক ক্ষেত্রের কোডনাম সহ "ক্ষেত্রগুলি" কলাম থেকে অভিধান রয়েছে যা 2 সিএসভি একসাথে বাঁধতে ব্যবহার করা যেতে পারে key

আপনার জসন ফাইলের জন্য এখানে একটি সমাধান যা নিস্টিত অভিধানগুলিকে 2 সিএসভিতে রূপান্তর করে।

import csv
import json

def readAndWrite(inputFileName, primaryKey=""):
    input = open(inputFileName+".json")
    data = json.load(input)
    input.close()

    header = set()

    if primaryKey != "":
        outputFileName = inputFileName+"-"+primaryKey
        if inputFileName == "data":
            for i in data:
                for j in i["fields"].keys():
                    if j not in header:
                        header.add(j)
    else:
        outputFileName = inputFileName
        for i in data:
            for j in i.keys():
                if j not in header:
                    header.add(j)

    with open(outputFileName+".csv", 'wb') as output_file:
        fieldnames = list(header)
        writer = csv.DictWriter(output_file, fieldnames, delimiter=',', quotechar='"')
        writer.writeheader()
        for x in data:
            row_value = {}
            if primaryKey == "":
                for y in x.keys():
                    yValue = x.get(y)
                    if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
                        row_value[y] = str(yValue).encode('utf8')
                    elif type(yValue) != dict:
                        row_value[y] = yValue.encode('utf8')
                    else:
                        if inputFileName == "data":
                            row_value[y] = yValue["codename"].encode('utf8')
                            readAndWrite(inputFileName, primaryKey="codename")
                writer.writerow(row_value)
            elif primaryKey == "codename":
                for y in x["fields"].keys():
                    yValue = x["fields"].get(y)
                    if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
                        row_value[y] = str(yValue).encode('utf8')
                    elif type(yValue) != dict:
                        row_value[y] = yValue.encode('utf8')
                writer.writerow(row_value)

readAndWrite("data")

4

আমি জানি যে এই প্রশ্নটি জিজ্ঞাসা করার পরে অনেক দিন হয়ে গেছে তবে আমি ভেবেছিলাম আমি অন্যের উত্তর যুক্ত করতে এবং একটি ব্লগ পোস্ট ভাগ করে নিতে পারি যা আমি মনে করি সমাধানটি খুব সংক্ষিপ্ত উপায়ে ব্যাখ্যা করব।

লিঙ্কটি এখানে

লেখার জন্য একটি ফাইল খুলুন

employ_data = open('/tmp/EmployData.csv', 'w')

সিএসভি রাইটার অবজেক্ট তৈরি করুন

csvwriter = csv.writer(employ_data)
count = 0
for emp in emp_data:
      if count == 0:
             header = emp.keys()
             csvwriter.writerow(header)
             count += 1
      csvwriter.writerow(emp.values())

বিষয়বস্তুগুলি সংরক্ষণ করার জন্য ফাইলটি বন্ধ করে দেওয়ার বিষয়টি নিশ্চিত করুন

employ_data.close()

3

এটি করা খুব স্মার্ট উপায় নয়, তবে আমার একই সমস্যা হয়েছে এবং এটি আমার পক্ষে কাজ করেছে:

import csv

f = open('data.json')
data = json.load(f)
f.close()

new_data = []

for i in data:
   flat = {}
   names = i.keys()
   for n in names:
      try:
         if len(i[n].keys()) > 0:
            for ii in i[n].keys():
               flat[n+"_"+ii] = i[n][ii]
      except:
         flat[n] = i[n]
   new_data.append(flat)  

f = open(filename, "r")
writer = csv.DictWriter(f, new_data[0].keys())
writer.writeheader()
for row in new_data:
   writer.writerow(row)
f.close()

3

অ্যালেকের উত্তর দুর্দান্ত, তবে বাসা বাঁধার একাধিক স্তর রয়েছে এমন ক্ষেত্রে এটি কার্যকর হয় না। এখানে একটি পরিবর্তিত সংস্করণ যা নীড়ের একাধিক স্তরকে সমর্থন করে। যদি নেস্টেড বস্তু ইতিমধ্যে নিজস্ব কী (যেমন ফায়ারবেস অ্যানালিটিক্স / বিগ টেবিল / বিগকিয়ার ডেটা) নির্দিষ্ট করে থাকে তবে এটি শিরোনামের নামগুলিকে কিছুটা সুন্দর করে তোলে:

"""Converts JSON with nested fields into a flattened CSV file.
"""

import sys
import json
import csv
import os

import jsonlines

from orderedset import OrderedSet

# from https://stackoverflow.com/a/28246154/473201
def flattenjson( b, prefix='', delim='/', val=None ):
  if val == None:
    val = {}

  if isinstance( b, dict ):
    for j in b.keys():
      flattenjson(b[j], prefix + delim + j, delim, val)
  elif isinstance( b, list ):
    get = b
    for j in range(len(get)):
      key = str(j)

      # If the nested data contains its own key, use that as the header instead.
      if isinstance( get[j], dict ):
        if 'key' in get[j]:
          key = get[j]['key']

      flattenjson(get[j], prefix + delim + key, delim, val)
  else:
    val[prefix] = b

  return val

def main(argv):
  if len(argv) < 2:
    raise Error('Please specify a JSON file to parse')

  filename = argv[1]
  allRows = []
  fieldnames = OrderedSet()
  with jsonlines.open(filename) as reader:
    for obj in reader:
      #print obj
      flattened = flattenjson(obj)
      #print 'keys: %s' % flattened.keys()
      fieldnames.update(flattened.keys())
      allRows.append(flattened)

  outfilename = filename + '.csv'
  with open(outfilename, 'w') as file:
    csvwriter = csv.DictWriter(file, fieldnames=fieldnames)
    csvwriter.writeheader()
    for obj in allRows:
      csvwriter.writerow(obj)



if __name__ == '__main__':
  main(sys.argv)

2

এটি তুলনামূলকভাবে ভাল কাজ করে। এটি কোনও সিএসভি ফাইলে লিখতে জাসনকে ফ্ল্যাট করে। নেস্টেড উপাদানগুলি পরিচালনা করা হয় :)

এটি অজগর 3 এর জন্য

import json

o = json.loads('your json string') # Be careful, o must be a list, each of its objects will make a line of the csv.

def flatten(o, k='/'):
    global l, c_line
    if isinstance(o, dict):
        for key, value in o.items():
            flatten(value, k + '/' + key)
    elif isinstance(o, list):
        for ov in o:
            flatten(ov, '')
    elif isinstance(o, str):
        o = o.replace('\r',' ').replace('\n',' ').replace(';', ',')
        if not k in l:
            l[k]={}
        l[k][c_line]=o

def render_csv(l):
    ftime = True

    for i in range(100): #len(l[list(l.keys())[0]])
        for k in l:
            if ftime :
                print('%s;' % k, end='')
                continue
            v = l[k]
            try:
                print('%s;' % v[i], end='')
            except:
                print(';', end='')
        print()
        ftime = False
        i = 0

def json_to_csv(object_list):
    global l, c_line
    l = {}
    c_line = 0
    for ov in object_list : # Assumes json is a list of objects
        flatten(ov)
        c_line += 1
    render_csv(l)

json_to_csv(o)

ভোগ করেন।


.csv ফাইলটি তৈরি করা হয়নি, পরিবর্তে, csv পাঠ্যটি কনসোলের আউটপুট ছিল। এছাড়াও, json.loadsকাজ করছিল না, আমি এটি দিয়ে কাজ করেছিলাম json.load, যা খুব সুন্দরভাবে একটি তালিকা অবজেক্ট দেয়। তৃতীয়ত, নেস্টেড উপাদানগুলি হারিয়ে গেছে।
জাইজিডি

2

এটি সমাধানের সহজ উপায়:

একটি নতুন পাইথন ফাইল তৈরি করুন: json_to_csv.py

এই কোড যুক্ত করুন:

import csv, json, sys
#if you are not using utf-8 files, remove the next line
sys.setdefaultencoding("UTF-8")
#check if you pass the input file and output file
if sys.argv[1] is not None and sys.argv[2] is not None:

    fileInput = sys.argv[1]
    fileOutput = sys.argv[2]

    inputFile = open(fileInput)
    outputFile = open(fileOutput, 'w')
    data = json.load(inputFile)
    inputFile.close()

    output = csv.writer(outputFile)

    output.writerow(data[0].keys())  # header row

    for row in data:
        output.writerow(row.values())

এই কোডটি যুক্ত করার পরে ফাইলটি সংরক্ষণ করুন এবং টার্মিনালে চালান:

পাইথন জসন_টো_সিএসভি.পি ইনপুট.টেক্সট আউটপুট.csv

আমি আশা করি এটি আপনাকে সাহায্য করবে

দেখা হবে!


1
এই নমুনা একটি কবজ মত কাজ করে! ভাগ করে নেওয়ার জন্য ধন্যবাদ আমি এই অজগর স্ক্রিপ্টটি ব্যবহার করে আমার জেসন ফাইলটি সিএসভিতে রূপান্তর করতে সক্ষম হয়েছিল
মোস্তফা

2

আশ্চর্যজনকভাবে, আমি দেখতে পেয়েছি যে এখানে এ পর্যন্ত পোস্ট করা উত্তরগুলির মধ্যে কোনওই সঠিকভাবে সমস্ত সম্ভাব্য পরিস্থিতিতে (যেমন নেস্টেড ডিক্টস, নেস্টেড তালিকাগুলি, কোনও মান ইত্যাদি নয়) নিয়ে ডিল করে না।

এই সমাধানটি সমস্ত পরিস্থিতিতে জুড়ে কাজ করা উচিত:

def flatten_json(json):
    def process_value(keys, value, flattened):
        if isinstance(value, dict):
            for key in value.keys():
                process_value(keys + [key], value[key], flattened)
        elif isinstance(value, list):
            for idx, v in enumerate(value):
                process_value(keys + [str(idx)], v, flattened)
        else:
            flattened['__'.join(keys)] = value

    flattened = {}
    for key in json.keys():
        process_value([key], json[key], flattened)
    return flattened

2

এটা চেষ্টা কর

import csv, json, sys

input = open(sys.argv[1])
data = json.load(input)
input.close()

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for item in data:
    output.writerow(item.values())

2

এই কোডটি কোনও প্রদত্ত জসন ফাইলের জন্য কাজ করে

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 17 20:35:35 2019
author: Ram
"""

import json
import csv

with open("file1.json") as file:
    data = json.load(file)



# create the csv writer object
pt_data1 = open('pt_data1.csv', 'w')
csvwriter = csv.writer(pt_data1)

count = 0

for pt in data:

      if count == 0:

             header = pt.keys()

             csvwriter.writerow(header)

             count += 1

      csvwriter.writerow(pt.values())

pt_data1.close()

1

অভ্যন্তরীণ তালিকাগুলি সহ জেএসএনকে সমর্থন করার জন্য অ্যালেক্স ম্যাকগেইলের উত্তর পরিবর্তিত হয়েছে

    def flattenjson(self, mp, delim="|"):
            ret = []
            if isinstance(mp, dict):
                    for k in mp.keys():
                            csvs = self.flattenjson(mp[k], delim)
                            for csv in csvs:
                                    ret.append(k + delim + csv)
            elif isinstance(mp, list):
                    for k in mp:
                            csvs = self.flattenjson(k, delim)
                            for csv in csvs:
                                    ret.append(csv)
            else:
                    ret.append(mp)

            return ret

ধন্যবাদ!


1
import json,csv
t=''
t=(type('a'))
json_data = []
data = None
write_header = True
item_keys = []
try:
with open('kk.json') as json_file:
    json_data = json_file.read()

    data = json.loads(json_data)
except Exception as e:
    print( e)

with open('bar.csv', 'at') as csv_file:
    writer = csv.writer(csv_file)#, quoting=csv.QUOTE_MINIMAL)
    for item in data:
        item_values = []
        for key in item:
            if write_header:
                item_keys.append(key)
            value = item.get(key, '')
            if (type(value)==t):
                item_values.append(value.encode('utf-8'))
            else:
                item_values.append(value)
        if write_header:
            writer.writerow(item_keys)
            write_header = False
        writer.writerow(item_values)

1

আমরা যদি সিএসভি ফর্ম্যাট ফাইলটিতে জসন ফর্ম্যাট ফাইল রূপান্তর করার জন্য নীচের উদাহরণটি বিবেচনা করি।

{
 "item_data" : [
      {
        "item": "10023456",
        "class": "100",
        "subclass": "123"
      }
      ]
}

নীচের কোডটি json ফাইল (ডেটা 3.জসন) কে সিএসভি ফাইলে (ডেটা 3 সিএসভি) রূপান্তর করবে।

import json
import csv
with open("/Users/Desktop/json/data3.json") as file:
    data = json.load(file)
    file.close()
    print(data)

fname = "/Users/Desktop/json/data3.csv"

with open(fname, "w", newline='') as file:
    csv_file = csv.writer(file)
    csv_file.writerow(['dept',
                       'class',
                       'subclass'])
    for item in data["item_data"]:
         csv_file.writerow([item.get('item_data').get('dept'),
                            item.get('item_data').get('class'),
                            item.get('item_data').get('subclass')])

উপরে উল্লিখিত কোডটি স্থানীয়ভাবে ইনস্টল করা পাইচার্মে কার্যকর করা হয়েছে এবং এটি জেসন ফাইলটিকে সফলভাবে সিএসভি ফাইলে রূপান্তর করেছে। আশা করি এই ফাইলগুলি রূপান্তর করতে সহায়তা করবে।


0

যেহেতু ডেটা অভিধানের বিন্যাসে উপস্থিত রয়েছে বলে মনে হচ্ছে, আপনার যথাযথ শিরোনামের তথ্য দিয়ে লাইনগুলি আউটপুট করতে আসলে csv.DictWriter () ব্যবহার করা উচিত। এটি রূপান্তরটি কিছুটা সহজভাবে পরিচালনা করার অনুমতি দেয়। ক্ষেত্রের নামগুলি প্যারামিটারের পরে অর্ডারটি যথাযথভাবে সেট আপ করা হত যখন শিরোনাম হিসাবে প্রথম লাইনের আউটপুট এটিকে পড়তে দেয় এবং পরে csv.DictReader () দ্বারা প্রক্রিয়া করার অনুমতি দেয়।

উদাহরণস্বরূপ, মাইক রেপাস ব্যবহার করা হয়েছে

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for row in data:
  output.writerow(row.values())

তবে কেবলমাত্র প্রাথমিক সেটআপটি আউটপুট = সিএসভিতে পরিবর্তন করুন ictডিক্ট রাইটার (ফাইলসেটিং, ফিল্ডনেমস = ডেটা [0] .কেজ ())

নোট করুন যেহেতু একটি অভিধানে উপাদানগুলির ক্রম সংজ্ঞায়িত করা হয়নি, আপনাকে ক্ষেত্রের নামগুলি স্পষ্টভাবে তৈরি করতে হতে পারে। একবার আপনি এটি করেন, লেখক কাজ করবে। লেখকগুলি তখন মূলত প্রদর্শিত হিসাবে কাজ করে।


0

দুর্ভাগ্যক্রমে আমি আশ্চর্যজনক @ অ্যালেক ম্যাকগেইল উত্তরে সামান্য অবদান রাখার মতো খ্যাতি পাইনি। আমি পাইথন 3 ব্যবহার করছিলাম এবং @ অ্যালেক্সিস আর মন্তব্য অনুসরণ করে আমার মানচিত্রটিকে একটি তালিকায় রূপান্তর করতে হবে।

সংযোজনী আমি দেখেছি সিএসভি লেখক ফাইলে একটি অতিরিক্ত সিআর যুক্ত করছিলেন (আমার কাছে প্রতিটি লাইনের সিএসভি ফাইলে থাকা ডেটা সহ ফাঁকা লাইন আছে)। @ জেসন আর.কমডস এই থ্রেডের উত্তর অনুসরণ করে সমাধানটি খুব সহজ ছিল: পাইথনে সিএসভি অতিরিক্ত গাড়ী চালনার যোগ করে

আপনাকে কেবল csv.writer- এ লাইনটারিনেটর = '\ n' পরামিতি যুক্ত করতে হবে। এটা হবে:csv_w = csv.writer( out_file, lineterminator='\n' )


0

আপনি এই কোডটি একটি জসন ফাইলকে সিএসভি ফাইলে রূপান্তর করতে ব্যবহার করতে পারেন ফাইলটি পড়ার পরে আমি অবজেক্টটিকে পান্ডাস ডেটাফ্রেমে রূপান্তর করছি এবং তারপরে এটি একটি সিএসভি ফাইলে সংরক্ষণ করছি

import os
import pandas as pd
import json
import numpy as np

data = []
os.chdir('D:\\Your_directory\\folder')
with open('file_name.json', encoding="utf8") as data_file:    
     for line in data_file:
        data.append(json.loads(line))

dataframe = pd.DataFrame(data)        
## Saving the dataframe to a csv file
dataframe.to_csv("filename.csv", encoding='utf-8',index= False)

এটি সাবফিল্ডগুলি (উদাহরণস্বরূপ "ক্ষেত্রগুলি") বিবেচনায় নেয় না - সাব-অবজেক্টটি পৃথক কলামগুলিতে পৃথক পৃথক পৃথক কলামের পরিবর্তে একটি কলামে থাকে।
ক্রাইবার

0

আমি পার্টিতে দেরি করতে পারি, তবে আমি মনে করি, আমিও একই সমস্যাটি মোকাবিলা করেছি। আমার কাছে একটি জসন ফাইল ছিল যা দেখতে দেখতে এ জাতীয় ছিল

JSON ফাইল কাঠামো

আমি এই জেসন ফাইল থেকে কেবল কয়েকটি কী / মান বের করতে চেয়েছি। সুতরাং, আমি একই কোডটি বের করার জন্য নিম্নলিখিত কোডটি লিখেছি।

    """json_to_csv.py
    This script reads n numbers of json files present in a folder and then extract certain data from each file and write in a csv file.
    The folder contains the python script i.e. json_to_csv.py, output.csv and another folder descriptions containing all the json files.
"""

import os
import json
import csv


def get_list_of_json_files():
    """Returns the list of filenames of all the Json files present in the folder
    Parameter
    ---------
    directory : str
        'descriptions' in this case
    Returns
    -------
    list_of_files: list
        List of the filenames of all the json files
    """

    list_of_files = os.listdir('descriptions')  # creates list of all the files in the folder

    return list_of_files


def create_list_from_json(jsonfile):
    """Returns a list of the extracted items from json file in the same order we need it.
    Parameter
    _________
    jsonfile : json
        The json file containing the data
    Returns
    -------
    one_sample_list : list
        The list of the extracted items needed for the final csv
    """

    with open(jsonfile) as f:
        data = json.load(f)

    data_list = []  # create an empty list

    # append the items to the list in the same order.
    data_list.append(data['_id'])
    data_list.append(data['_modelType'])
    data_list.append(data['creator']['_id'])
    data_list.append(data['creator']['name'])
    data_list.append(data['dataset']['_accessLevel'])
    data_list.append(data['dataset']['_id'])
    data_list.append(data['dataset']['description'])
    data_list.append(data['dataset']['name'])
    data_list.append(data['meta']['acquisition']['image_type'])
    data_list.append(data['meta']['acquisition']['pixelsX'])
    data_list.append(data['meta']['acquisition']['pixelsY'])
    data_list.append(data['meta']['clinical']['age_approx'])
    data_list.append(data['meta']['clinical']['benign_malignant'])
    data_list.append(data['meta']['clinical']['diagnosis'])
    data_list.append(data['meta']['clinical']['diagnosis_confirm_type'])
    data_list.append(data['meta']['clinical']['melanocytic'])
    data_list.append(data['meta']['clinical']['sex'])
    data_list.append(data['meta']['unstructured']['diagnosis'])
    # In few json files, the race was not there so using KeyError exception to add '' at the place
    try:
        data_list.append(data['meta']['unstructured']['race'])
    except KeyError:
        data_list.append("")  # will add an empty string in case race is not there.
    data_list.append(data['name'])

    return data_list


def write_csv():
    """Creates the desired csv file
    Parameters
    __________
    list_of_files : file
        The list created by get_list_of_json_files() method
    result.csv : csv
        The csv file containing the header only
    Returns
    _______
    result.csv : csv
        The desired csv file
    """

    list_of_files = get_list_of_json_files()
    for file in list_of_files:
        row = create_list_from_json(f'descriptions/{file}')  # create the row to be added to csv for each file (json-file)
        with open('output.csv', 'a') as c:
            writer = csv.writer(c)
            writer.writerow(row)
        c.close()


if __name__ == '__main__':
    write_csv()

আমি আশা করি এটি সাহায্য করবে এই কোডটি কীভাবে কাজ করে তার বিশদ জন্য আপনি এখানে পরীক্ষা করতে পারেন


0

এটি @ মাইকআরপাসের উত্তরের একটি পরিবর্তন। এই সংস্করণটি একটি ফাইলে সিএসভি লিখে এবং পাইথন 2 এবং পাইথন 3 উভয়ের জন্যই কাজ করে।

import csv,json
input_file="data.json"
output_file="data.csv"
with open(input_file) as f:
    content=json.load(f)
try:
    context=open(output_file,'w',newline='') # Python 3
except TypeError:
    context=open(output_file,'wb') # Python 2
with context as file:
    writer=csv.writer(file)
    writer.writerow(content[0].keys()) # header row
    for row in content:
        writer.writerow(row.values())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.