我有一个文件想要解析。它具有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个字符的mash混搭,我认为这是因为格式已经变成了无序列表?我想我能更好地理解我的问题,但是我仍然把我的头脑集中在数据结构和解析它们的方法上。我遗漏了什么?
发布于 2016-07-26 05:07:09
在阅读了问题和以上所有的答案后,请检查这是否对你有用。
我认为输入文件是简单文件,而不是csv或json文件。
代码流如下:
导入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
可以增加更多的检查点。
发布于 2016-07-26 04:14:51
正如错误声明的那样,您的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对象。
发布于 2016-07-26 04:18:25
如果您的输入文件是JSON,为什么不直接使用JSON库来解析它,然后对该数据运行一个for循环。然后,这只是迭代键和提取数据的问题。
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
pprint(data)看看贾斯汀·皮尔的答案。应该会有帮助的。
https://stackoverflow.com/questions/38580839
复制相似问题