【问题标题】:What is the difference between ^M, $, and \n (newline) in Python? [duplicate]Python 中的 ^M、$ 和 \n(换行符)有什么区别? [复制]
【发布时间】:2017-01-08 23:05:42
【问题描述】:

我正在处理一个文本文件(包含电子名片),并且需要在每一行的末尾删除 ^M(留下换行符),除了在 NOTES 字段中(因为看起来 ^M 表示该行继续并且环绕)。请参阅从文件的 vi 编辑器中截取的附图,其中 vi 自动以蓝色显示换行符...

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

更广泛地说,Python 中的 ^M、$ 和 \n(换行符)有什么区别?各自的作用是什么?

请注意,我的问题的重点与以下内容完全无关:

Vcard parser with Python

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

关注的范围更广。它是要了解这个 ^M 字符是什么,它是否与换行符有关,是否与 Python 或只是一个 vobject 构造有关。如果是后者,而 ^M 没有一般意义,为什么 vi 编辑器会用蓝色表示?我觉得有点奇怪的是,在 vi 中,这些带有 ^M 的换行符后跟一个回车符和一个空格,就好像“^M$”是一个表示“无意换行符”的特殊序列一样......再次,这三个字符序列对 vobject 来说是不是特殊的,更通用还是只是我想象的一部分(在这三种情况中的任何一种中,为什么 vi 上的蓝色)。

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

【问题讨论】:

  • ^M 在 Python 中没有任何意义。 $ 仅在正则表达式中有意义,表示行尾。 \n 是换行符;大多数 Python 可执行文件都使用通用换行符支持进行编译,因此 \n 可以是回车符或换行符或其中之一。
  • 谢谢 Kindall,这很有帮助。如果没有任何特殊含义,您知道为什么 vi 将 ^M 标记为蓝色吗?您认为 ^M 是 vcard 标准还是 vobjects 实现定义的特殊字符?如果是这样,当我们想在注释字段中使用 ^M 时是否应该有一个特殊的编码?
  • vi 可能会将数据中的嵌入式回车显示为^M。你没有提到vi所以我没有提到它。
  • 这对 Kindall 很有帮助。我应该提到它,因为我有初学者的 vi 图片(我现在已经更新了问题以反映这一点)。我不知道嵌入式回车是什么,但让我搜索并从中学习。这就是我试图摆脱这个问题的原因。回车的整个处理有点令人兴奋,尤其是 vcard 有三个序列 ^M,然后是 $,然后是空格。再次感谢您!

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


【解决方案1】:

RFC 6350 states:

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

[…]

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

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

【讨论】:

    【解决方案2】:

    关注的范围更广。就是要明白这是什么^M 字符,如果它与换行符有关,如果它与 Python 或 只是一个 vobject 构造。如果是后者,^M没有一般性 意思是,为什么 vi 编辑器会用蓝色发出信号?

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

    要找到您真正问题的答案(^M 是什么),请查看 What does ^M character mean in Vim?

    documentation for vim 有一个其他二合字母列表及其含义。

    vi和weather这两个中的$有什么区别 字符在python中有任何特殊含义。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 2013-03-04
      • 2020-12-06
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      相关资源
      最近更新 更多