简体   繁体   中英

How to convert JSON file to CSV

I have the following JSON file:

[
    {
      "Names": {
         "0": "Nat",
         "1": "Harry",
         "2": "Joe"
      },
      "Marks": {
         "0": 78.22,
         "1": 32.54,
         "2": 87.23
      }
   }
]

I have written the following code for conversion:

import csv, json

def conversion(Jsonfile,Csvfile):
    readfile=open(Jsonfile,"r")
    print(readfile)
    jsondata=json.load(readfile)
    print(jsondata)
    readfile.close()
    
    data_file=open(Csvfile,'w')
    csv_writer=csv.writer(data_file)
    
    count=0
    for data in jsondata:
        if count==0:
            header=data.keys()
            print(header)
            csv_writer.writerow(header)
            count=count+1
        
        csv_writer.writerow(data.values())
        print(data.values())
    data_file.close()

Jsonfile="Series.json"
Csvfile="convertedfile.csv"

conversion(Jsonfile,Csvfile)

I am getting the following output in CSV

Names,Marks

"{'0': 'Nat', '1': 'Harry', '2': 'Joe'}","{'0': 78.22, '1': 32.54, '2': 87.23}"

My question is how to correct the code to get the following output ( that is each name with marks in a different line):

Names,Marks
0,Nat,78.22
1,Harry,32.54
2,Joe,87.23

pandas has the utility for both, reading json and writing csv.

import pandas as pd


 j = '[{"Names":{"0":"Nat","1":"Harry","2":"Joe"},"Marks":{"0":78.22,"1":32.54,"2":87.23}}]'
df = pd.read_json(j[1:-1], orient='records')  # 1:-1 because we need to remove the square brackets
df.to_csv("output.csv")

Output:

,Names,Marks
0,Nat,78.22
1,Harry,32.54
2,Joe,87.23

Here's a way of doing it.

First, we open the json file and parse it:

import json

json_file = "foo.json"
csv_file = "foo.csv"

with open(json_file, "r") as f:
    json_data = json.load(f)

We then extract the dict from the json list:

my_dict = json_data[0]  # we get the dict inside the list
my_list = []  # we create a new list to store data in the format we need

We format the data in a way we can easily print it to the file:

for key in my_dict["Names"].keys():
    my_list.append(
        [
            key,
            my_dict["Names"][key],
            str(my_dict["Marks"][key])  # we cast the mark to string so it's easier to use later on
        ]
    )

And now, the data is formatted in a way that's easy to print for us, so we just save it as such in our csv file!

# Our new list is now created, we can now save it to our file
with open(csv_file, "w") as f:
    f.write("Names,Marks\n")
    for line in my_list:
        f.write(",".join(line) + "\n")

Output:

Names,Marks
0,Nat,78.22
1,Harry,32.54
2,Joe,87.23
import pandas as pd

df = pd.read_json(r'Path where the JSON file is saved\File Name.json')
df.to_csv(r'Path where the new CSV file will be stored\New File Name.csv', index = None)

You can generate a valid CSV file from the JSON data without heavyweight modules such as pandas or csv . You only need the json module to load the JSON data from the file and (implicitly) validate it.

import json

Jsonfile = 'Series.json'
Csvfile = 'convertedfile.csv'

with open(Jsonfile) as jfile:
    d = json.load(jfile)[0]

    with open(Csvfile, 'w') as cfile:
        print('ID,Name,Marks', file=cfile)
        if names := d.get('Names'):
            for id_, name in names.items():
                mark = d.get('Marks', {}).get(id_, '')
                print(f'{id_},{name},{mark}', file=cfile)

The output file will look like this:

ID,Name,Marks
0,Nat,78.22
1,Harry,32.54
2,Joe,87.23

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM