python - मैं JSON को CSV में कैसे परिवर्तित कर सकता हूं?




(10)

इसे हल करने का मेरा सरल तरीका:

एक नई पायथन फ़ाइल बनाएं जैसे: 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())

इस कोड को जोड़ने के बाद, फ़ाइल को सहेजें और टर्मिनल पर चलाएं:

python json_to_csv.py input.txt output.csv

उम्मीद है इससे आपको मदद होगी।

फिर मिलेंगे!

मेरे पास एक JSON फ़ाइल है जिसे मैं एक CSV फ़ाइल में गुप्त करना चाहता हूं। मैं पायथन के साथ यह कैसे कर सकता हूं?

मैंने कोशिश की:

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)

f.close()

हालांकि, यह काम नहीं किया। मैं Django का उपयोग कर रहा हूँ और मुझे मिली त्रुटि है:

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:
    csv_file.writerow(item)

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
    }
  }
]

एक सामान्य समाधान जो फ्लैट वस्तुओं की किसी भी जेसन सूची को सीएसवी में अनुवाद करता है।

Input.json फ़ाइल को कमांड लाइन पर पहले तर्क के रूप में पास करें।

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())

जेएसओएन के अंदर सूचियों के साथ समर्थन करने के लिए संशोधित एलेक मैकगेल का जवाब

    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

धन्यवाद!


जेएसओएन विभिन्न प्रकार की डेटा संरचनाओं का प्रतिनिधित्व कर सकता है - एक जेएस "ऑब्जेक्ट" मोटे तौर पर एक पाइथन dict (स्ट्रिंग कुंजियों के साथ) की तरह है, एक जेएस "सरणी" मोटे तौर पर एक पायथन सूची की तरह है, और आप उन्हें अंतिम " पत्ता "तत्व संख्या या तार हैं।

सीएसवी अनिवार्य रूप से केवल 2-डी तालिका का प्रतिनिधित्व कर सकता है - वैकल्पिक रूप से "शीर्षलेख" की पहली पंक्ति के साथ, यानी, "कॉलम नाम", जो तालिका को सामान्य व्याख्या के बजाय, डिक्ट्स की सूची के रूप में व्याख्यात्मक बना सकता है, की एक सूची सूचियां (फिर से, "पत्ता" तत्व संख्या या तार हो सकते हैं)।

तो, सामान्य मामले में, आप एक मनमानी JSON संरचना को CSV में अनुवाद नहीं कर सकते हैं। कुछ विशेष मामलों में आप (आगे के घोंसले के साथ सरणी की सरणी; ऑब्जेक्ट्स के सरणी जिनमें सभी की एक ही कुंजी होती है)। कौन सा विशेष मामला, यदि कोई है, तो आपकी समस्या पर लागू होता है? समाधान का विवरण इस बात पर निर्भर करता है कि आपके पास कौन सा विशेष मामला है। आश्चर्यजनक तथ्य यह देखते हुए कि आप यह भी उल्लेख नहीं करते कि कौन सा लागू होता है, मुझे संदेह है कि आपने बाधा नहीं माना हो सकता है, न ही व्यावहारिक मामला वास्तव में लागू होता है, और आपकी समस्या हल करना असंभव है। लेकिन कृपया स्पष्ट करें!


मुझे दान के प्रस्तावित समाधान में परेशानी हो रही थी, लेकिन यह मेरे लिए काम करता था:

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 } }
]

मुझे पता है कि यह सवाल बहुत लंबा रहा है क्योंकि इस सवाल से पूछा गया है, लेकिन मैंने सोचा कि मैं हर किसी के जवाब में जोड़ सकता हूं और एक ब्लॉग पोस्ट साझा कर सकता हूं जो मुझे लगता है कि समाधान को बहुत संक्षिप्त तरीके से समझाता है।

link यहाँ है

लेखन के लिए एक फाइल खोलें

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()

मुझे लगता है कि आपकी JSON फ़ाइल शब्दकोशों की सूची में डीकोड होगी। सबसे पहले हमें एक फ़ंक्शन की आवश्यकता है जो 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
}

जेएसओएन ऑब्जेक्ट्स के इनपुट सरणी में प्रत्येक फोकस को इस फ़ंक्शन को लागू करने के बाद:

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 ) )

आशा है कि ये आपकी मदद करेगा!


यह अपेक्षाकृत अच्छी तरह से काम करता है। यह जेएसन को एक सीएसवी फ़ाइल में लिखने के लिए flattens। नेस्टेड तत्व प्रबंधित हैं :)

यह अजगर 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)

का आनंद लें।


यह कोड आपके लिए काम करना चाहिए, यह मानते हुए कि आपका 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:
        csv_file.writerow([item['pk'], item['model']] + item['fields'].values())

csv.DictWriter() का उपयोग करना आसान होगा। csv.DictWriter() , विस्तृत कार्यान्वयन इस तरह हो सकता है:

def read_json(filename):
    return json.loads(open(filename).read())
def write_csv(data,filename):
    with open(filename) 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 ऑब्जेक्ट्स में एक ही फ़ील्ड हैं।

यहां reference जो आपकी मदद कर सकता है।





csv