簡體   English   中英

Python遍歷字典

[英]Python Loop through dictionary

我有一個要解析的文件。 它具有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:“文件”對象沒有屬性“ getitem

我知道這只是嘗試打印而不是做我想做的事,但是我是python的新手,對我做錯了卻迷失了。 正確的方法是什么? 對於ID,我的最終結果應如下所示:

['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個字符的混搭,我認為這是因為格式已變成無序的列表嗎? 我想我對問題的理解要好一些,但是仍然將我的頭放在數據結構和解析它們的方法上。 我想念什么?

閱讀問題和以上所有答案后,請檢查是否對您有用。

我已經將輸入文件視為簡單文件,而不是csv或json文件。

代碼流程如下:

  • 以相反的順序打開和讀取文件。
  • 在線搜索ID。 提取ID並存儲在temp變量中。
  • 繼續逐行讀取文件並搜索totalReplyCount。
  • 一旦獲得totalReplyCount,請檢查它是否大於0。
  • 如果是,則將臨時ID存儲在id_list中,然后重新初始化臨時變量。
 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 

可以添加更多檢查點。

如錯誤所述,您的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)

使用Python從JSON文件解析值?

看賈斯汀·皮爾的答案。 應該會有所幫助。

使用Python解析JSON文件中的值 ,此鏈接是否全部@ 使用Python解析JSON文件中的值? 通過stackoverflow。

這是一個單線外殼,應該可以解決您的問題,盡管它不是python。

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

輸出:

"kjsdbesd2wd2eedd23rf3r3r2e2dwe2edsd"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM