如何在格式不正确的情况下读取python中的文本文件?

时间:2015-04-17 21:48:03

标签: python string dictionary text-files

当我选择倾销数据的方式时,我犯了一个大错误; 现在我有一个文本文件,包含

{ "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)

2 个答案:

答案 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'>