我有一个我想要解析的文件。它具有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个字符的混合,我认为这是因为格式变成了无序列表?我认为我对我的问题了解得更好,但仍然围绕数据结构和用于解析它们的方法。我错过了什么?
答案 0 :(得分:1)
在阅读完问题和所有上述答案后,请检查这是否对您有用。
我认为输入文件是简单文件而不是csv或json文件。
代码流程如下:
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)
正如错误所述,您的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对象
答案 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"