Iram Khan
Iram Khan

Reputation: 37

Read text file and dump to json object

I am doing a task in python (learning phase) wherein i have a text file with list of ip's eg: 10.8.9.0 10.7.8.7 10.4.5.6 and so on. Each on one line , one below another.

I have to read its contents and create its json as [{"ip":"10.8.9.0"},{"ip":"10.7.8.7"}..]

Code:

    with open("filename.txt") as file:
        content = [x.strip('\n') for x in file.readlines()]
        print content   
        print "content",type(content)
        content_json=json.dumps(content)
        print content_json
        print type(content_json)

The output of content is ['ip adrress1','ip address2'] which is a list.

When i dump the list in content_json the type shown is "Str" . However i need it as json

My concern is - my further task is to validate ip and add a item in existing json stating {"status":"valid/invalid"}.

I dnt know how to do that as the type of my json is showing str.

  1. Kindly let me knw how to proceed and add status for every ip in existing json.

  2. Also i wish to know why is the type of the json i dumped my list with is being showed as str.

The desired output should be

[ { "ip":"10.8.9.0", "status":"valid" }, { "ip":"10.7.8.A", "status":"invalid" }, ..so on ]

Upvotes: 0

Views: 5413

Answers (5)

Iram Khan
Iram Khan

Reputation: 37

Finally, I got a fix:

import os
import sys
import json
from IPy import IP
filepath="E:/Work/"
filename="data.txt"
result = list()
with open(os.path.join(filepath+filename)) as file:
  for line in file:
     ip = line.strip()
     if ip.startswith("0"):
        result.append({"ip": line.strip(), "status": "invalid"})
     else:
        try:
            ip_add=IP(ip)
            result.append({"ip": line.strip(), "status": "Valid"})
        except ValueError:
            result.append({"ip": line.strip(), "status": "invalid"})
print(json.dumps(result))

Upvotes: 0

salomonderossi
salomonderossi

Reputation: 2188

Maybe something like this?

import json
import socket

result = list()
with open("filename.txt") as file:
    for line in file:
        ip = line.strip()
        try:
            socket.inet_aton(ip)
            result.append({"ip": line.strip(), "status": "valid"})
        except socket.error:
            result.append({"ip": line.strip(), "status": "invalid"})

print(json.dumps(result))

Upvotes: 0

yorodm
yorodm

Reputation: 4461

First thing: The result is a list because you're building a list with [x.strip('\n') for x in file.readlines()]. In case you're not sure that means: Take every line x in file, remove the \n character from it and then build a list of those results. You want something like [{"ip":x.strip('\n')} for x in file.readlines()]. Now, the function json.dumps takes a Python object and attempts to create a JSON representation of it. That representation is serialized as a string so if you ask for the type of content_json that's what you'll get.

Upvotes: 1

Krash
Krash

Reputation: 1

You should supply key:value properly for the dump. Putting just the value alone would store it as String

Refer this : https://docs.python.org/2/library/json.html

Upvotes: 0

timgeb
timgeb

Reputation: 78690

You have to make the distinction between a python list/dictionary and a JSON string.

This

>>> with open('input.txt') as inp:
...     result = [dict(ip=ip.strip()) for ip in inp]
... 
>>> result
[{'ip': '10.8.9.0'}, {'ip': '10.7.8.7'}, {'ip': '10.4.5.6'}]

will give you a list of dictionaries that is easy to mutate. When you are done with it, you can dump it as a JSON string:

>>> result[1]['status'] = 'valid'
>>> result
[{'ip': '10.8.9.0'}, {'status': 'valid', 'ip': '10.7.8.7'}, {'ip': '10.4.5.6'}]
>>> json.dumps(result)
'[{"ip": "10.8.9.0"}, {"status": "valid", "ip": "10.7.8.7"}, {"ip": "10.4.5.6"}]'

Upvotes: 0

Related Questions