如何读取 python 格式不成功的文本文件?

How to read text file in python with unsuccessful format?

我在选择转储数据的方式时犯了一个大错误; 现在我有一个文本文件,其中包含

{ "13234134": ["some", "strings", ...]}{"34545345": ["some", "strings", ...]} ..so on

如何将其读入 python?

编辑: 我试过 json, 当我在文件开头和结尾手动添加大括号时,我有 "ValueError: Expecting property name:",因为“13234134”字符串可能对 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)

考虑简单地将其重写为有效的内容 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'>

看起来您拥有的是 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))