17

Trying to push csv data in to mongodb using python.i'm a beginner to python & mongodb..i used the following code

import csv
import json
import pandas as pd
import sys, getopt, pprint
from pymongo import MongoClient
#CSV to JSON Conversion
csvfile = open('C://test//final-current.csv', 'r')
jsonfile = open('C://test//6.json', 'a')
reader = csv.DictReader( csvfile )
header= [ "S.No", "Instrument Name", "Buy Price", "Buy Quantity", "Sell Price", "Sell Quantity", "Last Traded Price", "Total Traded Quantity", "Average Traded Price", "Open Price", "High Price", "Low Price", "Close Price", "V" ,"Time"]
#fieldnames=header
output=[]
for each in reader:
    row={}
    for field in header:
        row[field]=each[field]
    output.append(row)

json.dump(output, jsonfile, indent=None, sort_keys=False , encoding="UTF-8")
mongo_client=MongoClient() 
db=mongo_client.october_mug_talk
db.segment.drop()
data=pd.read_csv('C://test//6.json', error_bad_lines=0)
df = pd.DataFrame(data)
records = csv.DictReader(df)
db.segment.insert(records)

but the output is given in this format

/* 0 */
{
  "_id" : ObjectId("54891c4ffb2a0303b0d43134"),
  "[{\"AverageTradedPrice\":\"0\"" : "BuyPrice:\"349.75\""
}

/* 1 */
{
  "_id" : ObjectId("54891c4ffb2a0303b0d43135"),
  "[{\"AverageTradedPrice\":\"0\"" : "BuyQuantity:\"3000\""
}

/* 2 */
{
  "_id" : ObjectId("54891c4ffb2a0303b0d43136"),
  "[{\"AverageTradedPrice\":\"0\"" : "ClosePrice:\"350\""
}

/* 3 */
{
  "_id" : ObjectId("54891c4ffb2a0303b0d43137"),
  "[{\"AverageTradedPrice\":\"0\"" : "HighPrice:\"0\""
}

Actually i want the output to like for single id all the other fields should be showed as subtypes eg:

 _id" : ObjectId("54891c4ffb2a0303b0d43137")
    AveragetradedPrice :0
    HighPrice:0
    ClosePrice:350
    buyprice:350.75

Please help me Out.Thanks in advance

5
  • output.append(row) => db.segment.insert(row) Commented Dec 11, 2014 at 6:14
  • but if i'm pushing directly to mongodb ,it produces InvalidDocument: key 'S.No' must not contain '.' Commented Dec 11, 2014 at 6:36
  • Make header as a dict to map s.no as s_no so it will be accetable as json key Commented Dec 11, 2014 at 6:43
  • Is there a special reason not to use mongoimport? Commented Dec 11, 2014 at 7:33
  • Finally i got it done.Thank you Commented Dec 11, 2014 at 7:34

5 Answers 5

20

Thank you for the suggestion.This one is the corrected code:

import csv
import json
import pandas as pd
import sys, getopt, pprint
from pymongo import MongoClient
#CSV to JSON Conversion
csvfile = open('C://test//final-current.csv', 'r')
reader = csv.DictReader( csvfile )
mongo_client=MongoClient() 
db=mongo_client.october_mug_talk
db.segment.drop()
header= [ "S No", "Instrument Name", "Buy Price", "Buy Quantity", "Sell Price", "Sell Quantity", "Last Traded Price", "Total Traded Quantity", "Average Traded Price", "Open Price", "High Price", "Low Price", "Close Price", "V" ,"Time"]

for each in reader:
    row={}
    for field in header:
        row[field]=each[field]

    db.segment.insert(row)
Sign up to request clarification or add additional context in comments.

Comments

7

Why do you insert data one by one? Take a look at this one.

import pandas as pd
from pymongo import MongoClient

client = MongoClient(<your_credentials>)
database = client['YOUR_DB_NAME']
collection = database['your_collection']

def csv_to_json(filename, header=None):
    data = pd.read_csv(filename, header=header)
    return data.to_dict('records')

collection.insert_many(csv_to_json('your_file_path'))

Please be aware of that it might crash your app when the file is too big.

Comments

6

The easiest way is by using pandas my code is

import json
import pymongo
import pandas as pd
myclient = pymongo.MongoClient()

df = pd.read_csv('yourcsv.csv',encoding = 'ISO-8859-1')   # loading csv file
df.to_json('yourjson.json')                               # saving to json file
jdf = open('yourjson.json').read()                        # loading the json file 
data = json.loads(jdf)                                    # reading json file 

now you can insert this json in your mangodb database :-]

1 Comment

er, showing that part you leave at is what the question asks.
0

There is a better way with less number of imports, assuming you have a header row in your CSV.

from pymongo import MongoClient
import csv

# DB connectivity
client = MongoClient('localhost', 27017)
db = client.db
collection = db.collection

# Function to parse csv to dictionary
def csv_to_dict():
    reader = csv.DictReader(open(FILEPATH))
    result = {}
    for row in reader:
        key = row.pop('First_value')
        result[key] = row
    return query

# Final insert statement
db.collection.insert_one(csv_to_dict())

Hope that helps

Comments

0
    from pymongo import MongoClient
    import csv
    import json
    # DB connectivity
    client = MongoClient('localhost', 27017)
    db = client["database name"]
    col = db["collection"]
    # Function to parse csv to dictionary
    def csv_to_dict():
        reader = csv.DictReader(open('File with path','r'))
        result = {}
        for row in reader:
            key = row.pop('id')
            result[key]= row
        return result
    
    # Final insert statement
    x=col.insert_one(csv_to_dict())
            print(x.inserted_id)

# to insert one row

#and to insert many rows following code is to be executed
from pymongo import MongoClient
import csv
# read csv file as a list of lists
client = MongoClient('localhost', 27017)
db = client["data base name"]
col = db["Collection Name"]
with open('File with path', 'r') as read_obj:
    # pass the file object to reader() to get the reader object
    csv_reader = csv.DictReader(read_obj)
    # Pass reader object to list() to get a list of lists
    mylist = list(csv_reader)
    #print(list_of_rows)
    x = col.insert_many(mylist)

    #print list of the _id values of the inserted documents:
    print(x.inserted_ids)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.