Python中的^ M,$和\ n(换行符)有什么区别?

时间:2017-01-08 23:05:43

标签: python character-encoding special-characters newline vcard

我正在处理一个文本文件(包含vcards),需要在每行的末尾删除^ M(留下换行符号),但在NOTES字段中除外(因为似乎^ M表示该行继续运行包裹着)。请参阅文件的vi编辑器中的附图,其中换行符由vi自动显示为蓝色...

enter image description here

如果我用with语句读取文件的行(并在处理它们后写下它们),我应该如何处理每一行?

更广泛地说,Python中的^ M,$和\ n(换行符)有什么区别?每个人的角色是什么?

请注意,我的问题的重点与:

完全无关

Vcard parser with Python

当然,我可以通过输入s / \ n //或使用re或甚至使用序列化甚至在vobject中使用sortedChildren方法来删除vi中NOTES字段中的奇怪行为。但这不是我问题的焦点。

重点更加广泛。它是要了解这个^ M字符是什么,如果它与换行有关,如果它与Python或vobject构造有关。如果是后者,并且^ M没有一般含义,为什么它由vi编辑器以蓝色显示?我发现有点奇怪的是,在vi中,这些与^ M的换行符后跟一个回车符和一个BLANK空格,好像“^ M $”是一个特殊的序列来表示“无意的换行符”......再次,这三个字符序列对于vobjects来说是特殊的,更通用的或者只是我想象的一部分(在这三种情况中,为什么蓝色在vi上)。

我在当前问题中试图理解的是为什么vi将^ M标记为蓝色,与vi和天气中的$有什么区别这两个字符在python中有任何特殊含义。因为我注意到vi设置^ M在回车相关的“NOTES”字段中,它似乎有固定的长度(无论NOTES上的返回中断),我试图理解为什么,我没有找到任何解释

2 个答案:

答案 0 :(得分:1)

RFC 6350 states

  

vCard中的各个行由CRLF序列(U + 000D后跟U + 000A)分隔。

     

[...]

     

通过插入紧接着单个空格字符(空格(U + 0020)或水平制表符(U + 0009))的CRLF,可以将长逻辑行文本拆分为多物理线表示形式[...]

您只是在NOTES部分注意到这一点,因为您在那里找到了长行的文字。您必须阅读您尝试解析的文件格式的文档。

答案 1 :(得分:0)

  

重点更加广泛。这是为了理解这是什么^ M.   字符,如果它与换行符相关,如果它与Python或   只是一个vobject构造。如果是后者,则^ M没有一般性   意思是,为什么用vi编辑器用蓝色表示?

根据您的语法着色方案,它将^M标记为蓝色。

要查找真实问题的答案(^M),请查看What does ^M character mean in Vim?

documentation for vim列出了其他有向图及其含义。

  

与vi和天气这两者有什么不同   字符在python中有任何特殊含义。

$在正则表达式中使用时始终表示行尾。就其本身而言,$在Python中没有特殊含义,除非用作正则表达式的一部分 - 这意味着它与vim中的相同。