用Python处理JSON中的Markdown换行符

-1 投票
2 回答
1101 浏览
提问于 2025-04-18 14:04

我有一个字典,它在一个文件中是这样表示的。

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

撰写回答