用Python处理JSON中的Markdown换行符
我有一个字典,它在一个文件中是这样表示的。
{"title" : "My Test Document", "tags" : "tag1, tag2",
"body" : "## My Test Document
Now is the time for all good men to come to the aid of their country.
The quick brown fox jumped over the lazy dog's back."
}
其中“body”的内容是用markdown格式写的。
当我执行这段代码时——
f = 'my_file.txt'
data = json.load(open(f))
——我遇到了以下错误:
ValueError: Invalid control character at: line 3 column 30 (char 84)
我猜这可能跟JSON处理换行符有关。有没有好的方法来处理这些字符,以确保markdown的完整性?有没有比JSON更好的方式来处理这个文件?我需要能够手动创建这些文件,并且能够在程序中将它们当作字典来使用。其他的要求都可以不考虑。
更新:
最终我会有一个机器程序来格式化这些文件再保存。在那之前,这是我能想到的最简单的解决办法:
str=myfile.read().replace('\n', '\\n')
str = str.replace("\\n\\n\"body\"", " \"body\"")
我更希望使用一种对换行符友好的格式。Pickle的使用比JSON还要复杂。我会把这个问题保持开放,以防有人有更简单的解决方案。
2 个回答
0
对于这个错误:
AttributeError: 'str' object has no attribute 'read'
你可以用 json.loads
来替代 json.load
,这样就能避免这个错误了。
因为 json.load
需要一个像文件一样的对象作为参数,而 json.loads
则接受一个字符串(str
)或Unicode字符串(unicode
)作为参数。
1
如果你真的坚持要这样做
my_text = open("some_text.json").read()
split1 = my_text.split('body" :')
fixed_body = split1[-1].rsplit('"',1)[0].replace("\n","\\n")
fixed_text = split1[0] + 'body" :' + fixed_body + '"}'
d =json.loads(fixed_text)
但这真的是个糟糕的解决办法,正确的做法是生成正确的JSON格式...
稍微好一点的方法是用re
手动解析它
my_text = open("some_text.json").read().strip("{}")
d = dict((k,v) for k,v in re.findall('"([^"]+)" : "([^"]+)"',my_text))
print d
不过这仍然算是个比较“hacky”的做法...
更新:因为提问者不局限于JSON
我想真正的答案是用YAML代替JSON
easy_install pyyaml
.
import yaml
print yaml.load(open("some_text.json").read())