最近在以 self.__print("#" * 20 + "\n") 调用自己写的 __print 接口时发现打印的时候 "\n" 没有打出来,进而发现了 split("\n") 与 splitlines() 方法的一些区别。
- 一个是参数上,
split需要传递一个字符串作为分隔符,可以不以换行标记进行字符串切割。两者的返回值都是列表。另外,如果想把字符串变成以每一个字符为元素的列表,应当使用list()函数而不是split()或split("")方法。 splitlines()会将三个换行标记"\r"、"\n"和"\r\n"视为换行符进行切割,例如执行"1\r2\n3\r\n4".splitlines()的结果为["1", "2", "3", "4"]。而"1\r2\n3\r\n4".split("\n")的结果则为["1\r2", "3\r", "4"]。也就是说,Python 字符串的split方法只会以字符串"\n"进行切割,不会将各种操作系统下的不同换行标记进行切割。- 若字符串以换行标记结尾,
splitlines()不会额外出现一个空串。例如"1\n".splitlines()的结果为["1"],而"1\n".split("\n")的结果为["1", ""]。但如果一个换行标记与上一个换行标记或字符串开头之间的内容为空,那么还是会会出现空串,例如"\r\n\r\r".splitlines()的结果为["", "", ""],其中第一个换行标记"\r\n"到字符串开头之间没有字符,产生第一个空串(索引 0),第二个换行标记"\r"到第一个换行标记"\r\n"之间没有字符,产生第二个空串(索引 1),第三个换行标记"\r"到第二个换行标记"\r"之间没有字符,产生第三个空串(索引 2)。

大概就是,基于以下两个原因,推荐 splitlines 在处理文本文档的时候使用,其它的根据需求使用啦!
- 有的人喜欢结尾不加一个换行标记,有的人喜欢多一个换行标记。使用
split替代的方案:切割后把结尾的空串都pop()掉。 - 换行标记在不同操作系统上不同,建议直接用
splitlines。使用split替代的方案:将所有"\r\n"先替换为"\n",再将所有"\r"替换为"\n"。
另外,可以看看 https://blog.csdn.net/weixin_42278473/article/details/86316474。