当我选择倾销数据的方式时,我犯了一个大错误; 现在我有一个文本文件,包含
{ "13234134": ["some", "strings", ...]}{"34545345": ["some", "strings", ...]} ..so on
如何将其读入python?
修改 我试过json, 当我手动添加文件大括号的开头和结尾时,我有“ValueError:Expecting property name:”,因为“13234134”字符串maybi对json无效,我不知道如何避免它。
EDIT1
with open('new_file.txt', 'w') as outfile:
for index, user_id in enumerate(users):
json.dump(dict = get_user_tweets(user_id), outfile)
答案 0 :(得分:3)
看起来你拥有的是一个无限的JSON对象流。就好像你在同一个文件上反复调用json.dump
或''.join(json.dumps(…) for …)
。而且,事实上,第一个正是你所做的。 :)
所以,你很幸运。 JSON是一种自定界定格式,这意味着您可以读取第一个JSON对象的末尾,然后从那里读取直到下一个JSON对象的末尾,依此类推。 raw_decode
方法基本上是困难的部分。
没有stdlib函数包装它,我不知道有任何库可以做到这一点,但它实际上很容易做到:
def loads_multiple(s):
decoder = json.JSONDecoder()
pos = 0
while pos < len(s):
pos, obj = decoder.raw_decode(s, pos)
yield obj
所以,而不是这样做:
obj = json.loads(s)
do_stuff_with(obj)
...你这样做:
for obj in loads_multi(s):
do_stuff_with(obj)
或者,如果您想将所有对象组合成一个大列表:
objs = list(loads_multi(s))
答案 1 :(得分:2)
考虑简单地将其重写为有效的json。如果您的错误数据确实只包含您已经显示的格式(一系列不以逗号分隔的json结构),那么只需添加逗号和方括号:
with open('/tmp/sto/junk.csv') as f:
data = f.read()
print(data)
s = "[ {} ]".format(data.strip().replace("}{", "},{"))
print(s)
import json
data = json.loads(s)
print(type(data))
输出:
{ "13234134": ["some", "strings"]}{"34545345": ["some", "strings", "like", "this"]}
[ { "13234134": ["some", "strings"]},{"34545345": ["some", "strings", "like", "this"]} ]
<class 'list'>