制表符在值之外作为分隔空格是合法的,但在字符串内则不是。请改用\t。
编辑:根据您的 cmets,我看到一些关于标签实际上是什么的困惑..
制表符只是一个普通字符,如“a”或“5”或“。”或您通过按键盘上的键输入的任何其他字符。它占用一个字节,其数值为 9。不涉及反斜杠或小写 't。
标签与“a”、“5”或“.”不同的类别是什么?事实上,作为一个使用眼球的人,您通常无法查看文本显示并识别或计算制表符字符。在视觉上,一系列制表符与一系列(通常较大但在视觉上仍不确定的)空格序列相同。
为了在用于计算机处理的文本中明确表示选项卡,我们有多种句法方法可以说“嘿,某个软件!稍后用制表符替换这个垃圾,好吗?” .
在编程语言的历史上,主要有两种方法;如果你回到 1950 年代,你会发现这两种方法并存,在两种最古老的高级语言中各有一种。 Lisp 已将字符文字命名为 #\Tab;一旦从程序源中读取它们,它们就会被转换。 Fortran 只有CHAR 函数,该函数在运行时调用并返回编号与参数匹配的字符:CHAR(9) 返回一个制表符。 (当然,如果它真的是 CHAR(9) 而不是 CHAR(某个表达式可以达到 9),优化编译器可能会注意到这一点,并在编译时用选项卡替换函数调用时间,让我们回到另一个营地。)
一般来说,对于这两种解决方案类型,如果您想将特殊字符粘贴到较大的字符串中,您必须自己进行连接;例如,一个 80 年代 hack BASIC 的孩子可能会这样写:
10 PRINT "This is a tab ->"; CHR$(9); "<- That was a tab"
但有些语言——尤其是以语言 B 开头的家族——引入了将这些字符直接包含在字符串文字中的能力:
printf("This is a tab -> *t <- That was a tab");
BCPL 保留了 * 语法,但该系列中的下一个语言 C 将其替换为反斜杠,可能是因为他们需要更频繁地读写文字星号而不是文字反斜杠。
不管怎样,很多语言,包括 Python 和 Javascript,都在这里借用或继承了 C 的约定。因此,在这两种语言中,"\t" 和'\t' 这两个表达式都会产生一个单字符字符串,其中一个字符是制表符。
JSON 基于 Javascript 的语法,但它只允许它的一个受限子集。例如,字符串必须用双引号 (") 而非单引号 (') 括起来,并且其中不允许有文字制表符。
这意味着您更新中的这个 Python 字符串:
foo = '{"My_string": "Foo bar.\t Bar foo."}'
不是有效的 JSON。 Python 解释器在读取字符串后立即将\t 序列转换为实际的制表符 - 远在 JSON 处理器看到它之前。
你可以告诉 Python 在字符串中加入文字 \t 而不是制表符,方法是加倍反斜杠:
foo = '{"My_string": "Foo bar.\\t Bar foo."}'
或者您可以使用“原始”字符串语法,它根本不解释特殊的反斜杠序列:
foo = r'{"My_string": "Foo bar.\t Bar foo."}'
无论哪种方式,JSON 处理器都会看到一个包含反斜杠后跟“t”的字符串,而不是包含制表符的字符串。