Python循环通过字典

时间:2016-07-26 04:04:58

标签: python json

我有一个我想要解析的文件。它具有json格式的数据,但该文件不是json文件。我想遍历文件,并提取totalReplyCount大于0的ID。

  {  "totalReplyCount": 0,
       "newLevel":{ 
           "main":{  
              "url":"http://www.someURL.com",
              "name":"Ronald Whitlock",
              "timestamp":"2016-07-26T01:22:03.000Z",
              "text":"something great"
              },
       "id":"z12wcjdxfqvhif5ee22ys5ejzva2j5zxh04"
    }
},
    {  "totalReplyCount": 4,
        "newLevel":{ 
           "main":{  
              "url":"http://www.someUR2L.com",
              "name":"other name",
              "timestamp":"2016-07-26T01:22:03.000Z",
              "text":"something else great"
             },
       "id":"kjsdbesd2wd2eedd23rf3r3r2e2dwe2edsd"
    }
},

我最初的尝试是做以下

def readCsv(filename):
    with open(filename, 'r') as csvFile:
        for row in csvFile["totalReplyCount"]:
            print row

但是我收到错误说明

  

TypeError:'file'对象没有属性' getitem '

我知道这只是一次尝试打印而不是我想做的事情,但我是python的新手并且因为我做错了而输了。这样做的正确方法是什么?对于ids,我的最终结果应如下所示:

['insdisndiwneien23e2es', 'lsndion2ei2esdsd',....]

编辑1- 7/26/16

当我复制代码时,我看到我的格式错误(已经很晚了,我累了......)。我将其切换为更像JSON的正确格式。这个新编辑正确匹配我正在解析的文件。然后我尝试用JSON解析它,并得到ValueError: Extra data: line 2 column 1 - line X column 1 :,其中第X行是该行的结尾。

 def readCsv(filename):
        with open(filename, 'r') as file:
            data=json.load(file)
            pprint(data)

我也试过DictReader,得到了KeyError: 'totalReplyCount'。字典是否未按顺序排列?

编辑2 -7/27/16

休息一下,回过头来思考它,我意识到我所拥有的(在正确按摩数据之后)是一个CSV文件,每行都包含一个合适的JSON对象。所以,我必须解析CSV文件,然后解析每一行,它是一个顶级,完整和完整的JSON对象。我以前尝试解析的代码如下,但我得到的只是第一个字符串字符,一个开放的大括号'{':

def readCsv(filename):
    with open(filename, 'r') as csvfile:
        for row in csv.DictReader(csvfile):
            for item in row:
                print item[0]

我猜DictReader正在将json对象转换为字符串,这就是为什么我只得到一个大括号而不是第一个键。如果我要做print item[0:5]我会在每一行上以无序的方式获得前4个字符的混合,我认为这是因为格式变成了无序列表?我认为我对我的问题了解得更好,但仍然围绕数据结构和用于解析它们的方法。我错过了什么?

5 个答案:

答案 0 :(得分:1)

在阅读完问题和所有上述答案后,请检查这是否对您有用。

我认为输入文件是简单文件而不是csv或json文件。

代码流程如下:

  • 以相反的顺序打开并读取文件。
  • 在线搜索ID。提取ID并存储在临时变量中。
  • 逐行阅读文件并搜索totalReplyCount。
  • 一旦你得到totalReplyCount,检查它是否大于0。
  • 如果是,则在id_list中存储临时ID并重新初始化临时变量。
import re
tmp_id_to_store = ''
id_list = []
for line in reversed(open("a.txt").readlines()):
    m = re.search('"id":"(\w+)"', line.rstrip())
    if m:
        tmp_id_to_store = m.group(1)
    n = re.search('{  "totalReplyCount": (\d+),', line.rstrip())
    if n:
        fou = n.group(1)
        if int(fou) > 0:
            id_list.append(tmp_id_to_store)
            tmp_id_to_store = ''
print id_list

可以添加更多检查点。

答案 1 :(得分:0)

正如错误所述,您的csvFilefile对象,它不是dict对象,因此您无法从中获取项目。

如果您的csvFile采用CSV格式,则可以使用csv模块将csv的每一行读入dict:

import csv
with open(filename) as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print row['totalReplyCount']

注意csv模块中的DictReader方法,它将读取你的csv行并将其解析为dict对象

答案 2 :(得分:0)

如果您的输入文件是JSON,为什么不使用JSON库来解析它,然后对该数据运行for循环。然后,只需迭代密钥并提取数据即可。

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)

pprint(data)

Parsing values from a JSON file using Python?

看看Justin Peel的回答。它应该有所帮助。

答案 3 :(得分:0)

从Python中的JSON文件中解析值,此链接通过stackoverflow将所有内容全部@ Parsing values from a JSON file using Python?

答案 4 :(得分:0)

这是一个shell one-liner,应该解决你的问题,虽然它不是python。

egrep -o '"(?:totalReplyCount|id)":(.*?)$' filename | awk '/totalReplyCount/ {if ($2+0 > 0) {getline; print}}' | cut -d: -f2

输出:

"kjsdbesd2wd2eedd23rf3r3r2e2dwe2edsd"