如何读取 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))
我在选择转储数据的方式时犯了一个大错误; 现在我有一个文本文件,其中包含
{ "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))