读取文本文件并转储到json对象

时间:2016-04-29 12:53:52

标签: python json

我在python(学习阶段)中执行任务,其中我有一个带有ip列表的文本文件,例如: 10.8.9.0 10.7.8.7 10.4.5.6等。每一行,一行在另一行之下。

我必须阅读其内容并将其json创建为[{" ip":" 10.8.9.0"},{" ip":&# 34; 10.7.8.7"} ..]

代码:

    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)

内容的输出是[' ip adrress1',' ip address2']这是 列表

当我将列表转储到 content_json 时,显示的类型为 " Str" 。 但是我需要它作为json

我担心的是 - 我的进一步任务是验证ip并在现有的json中添加一个项目,说明{" status":" valid / invalid"}。

我知道如何做到这一点,因为我的json的类型显示了str。

  1. 请让我知道如何继续并为现有的json中的每个ip添加状态。

  2. 此外,我想知道为什么我倾倒我的列表的json的类型显示为str。

  3. 所需的输出应为

    [   {    " IP":" 10.8.9.0&#34 ;,    "状态":"有效"   },   {    " IP":" 10.7.8.A&#34 ;,    "状态":"无效"   ,等等  ]

5 个答案:

答案 0 :(得分:1)

第一件事:结果是一个列表,因为你正在建立一个列表 [x.strip('\n') for x in file.readlines()]。如果您不确定这意味着:取出文件中的每一行x,从中删除\n字符,然后构建这些结果的列表。你需要像[{"ip":x.strip('\n')} for x in file.readlines()]这样的东西。 现在,函数json.dumps接受一个Python对象并尝试创建它的JSON表示。该表示被序列化为字符串,因此如果您要求 content_json 的类型是您将获得的。

答案 1 :(得分:0)

你必须区分python列表/字典和JSON字符串。

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

将为您提供易于变异的词典列表。完成后,可以将其转储为JSON字符串:

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

答案 2 :(得分:0)

您应该为转储正确提供密钥:值。仅仅将值存储为String

参考: https://docs.python.org/2/library/json.html

答案 3 :(得分:0)

也许是这样的?

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

答案 4 :(得分:0)

最后,我得到了一个修复:

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