首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python循环通过字典

Python循环通过字典
EN

Stack Overflow用户
提问于 2016-07-26 04:04:57
回答 5查看 425关注 0票数 0

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

代码语言:javascript
运行
复制
  {  "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"
    }
},

我最初的尝试是做以下工作

代码语言:javascript
运行
复制
def readCsv(filename):
    with open(filename, 'r') as csvFile:
        for row in csvFile["totalReplyCount"]:
            print row

但是我发现一个错误

TypeError:“file”对象没有属性“getitem

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

代码语言:javascript
运行
复制
['insdisndiwneien23e2es', 'lsndion2ei2esdsd',....]

编辑1-7/26/16

当我复制代码时,我发现自己在格式化上犯了一个错误(已经很晚了,我很累了)。我将其转换为更类似于JSON的适当格式。此新编辑与我正在解析的文件正确匹配。然后我尝试用JSON解析它,得到了ValueError: Extra data: line 2 column 1 - line X column 1:,其中X行是行的末尾。

代码语言:javascript
运行
复制
 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对象。我用来分析这一点的代码如下所示,但我得到的只是第一个字符串字符,一个打开的大括号{ '{‘:

代码语言:javascript
运行
复制
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个字符的mash混搭,我认为这是因为格式已经变成了无序列表?我想我能更好地理解我的问题,但是我仍然把我的头脑集中在数据结构和解析它们的方法上。我遗漏了什么?

EN

回答 5

Stack Overflow用户

发布于 2016-07-26 05:07:09

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

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

代码流如下:

  • 按相反顺序打开并读取文件。
  • 在队列中搜索ID。提取ID并存储在temp变量中。
  • 继续逐行读取文件并搜索totalReplyCount。
  • 得到totalReplyCount后,检查它是否大于0。
  • 如果是,则将临时ID存储在id_list中,并重新初始化temp变量.

导入re tmp_id_to_store = '‘id_list = [],如果m: tmp_id_to_store = m.group(1) n=re.search({ "totalReplyCount":(\d+),’),则在反(open(“a.txt”).readlines()):m=re.search(‘id“:”(\w+)“',line.rstrip()Line.rstrip()如果n: fou = n.group(1)如果int(fou) > 0: id_list.append( tmp_id_to_store ) tmp_id_to_store=‘print id_list

可以增加更多的检查点。

票数 1
EN

Stack Overflow用户

发布于 2016-07-26 04:14:51

正如错误声明的那样,您的csvFile是一个file对象,它不是一个dict对象,因此您无法从中获取一个项。

如果您的csvFile是CSV格式的,您可以使用csv模块将csv的每一行读成一个dict:

代码语言:javascript
运行
复制
import csv
with open(filename) as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
        print row['totalReplyCount']

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

票数 0
EN

Stack Overflow用户

发布于 2016-07-26 04:18:25

如果您的输入文件是JSON,为什么不直接使用JSON库来解析它,然后对该数据运行一个for循环。然后,这只是迭代键和提取数据的问题。

代码语言:javascript
运行
复制
import json
from pprint import pprint

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

pprint(data)

使用Python解析JSON文件中的值?

看看贾斯汀·皮尔的答案。应该会有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38580839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档