Python循环遍历字典

2024-04-25 08:48:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个要解析的文件。它有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"
    }
},

我最初的尝试是

^{pr2}$

但我有个错误

TypeError: 'file' object has no attribute 'getitem'

我知道这只是一次打印尝试,并没有做我想做的事情,但我是python的新手,对自己做错了什么感到茫然。正确的方法是什么?对于ID,我的最终结果应该如下所示:

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

编辑1-2016年7月26日

我看到我在复制代码时在格式上犯了一个错误(很晚了,我很累…)。转换成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)

我也试过听写器,得到了KeyError: 'totalReplyCount'。这本词典没有订吗?在

编辑2-2016年7月27日

在休息了一下,回到它,并仔细考虑之后,我意识到我所拥有的(在适当地处理数据之后)是一个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个字符的混合,我想这是因为格式已经变成了一个无序的列表?我想我对我的问题有了一点更好的理解,但是我仍然在思考数据结构和用于解析它们的方法。我错过了什么?在


Tags: 文件数据对象nameidjson编辑data
3条回答

如错误所述,您的csvFile是一个file对象,它不是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对象

如果您的输入文件是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?

看看贾斯汀的回答。应该有帮助。在

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

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

代码流程如下:

  • 以相反的顺序打开并读取文件。在
  • 在行中搜索ID。提取ID并存储在temp变量中。在
  • 继续逐行读取文件并搜索totalReplyCount。在
  • 一旦得到totalReplyCount,检查它是否大于0。在
  • 如果是,则将temp ID存储在ID_list中并重新初始化temp变量。在
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

可以添加更多检查点。在

相关问题 更多 >