【发布时间】:2017-01-08 23:05:42
【问题描述】:
我正在处理一个文本文件(包含电子名片),并且需要在每一行的末尾删除 ^M(留下换行符),除了在 NOTES 字段中(因为看起来 ^M 表示该行继续并且环绕)。请参阅从文件的 vi 编辑器中截取的附图,其中 vi 自动以蓝色显示换行符...
如果我用 with 语句读取文件的行(并在处理后写入),我应该如何处理每一行?
更广泛地说,Python 中的 ^M、$ 和 \n(换行符)有什么区别?各自的作用是什么?
请注意,我的问题的重点与以下内容完全无关:
当然,我可以通过输入 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