为何Jupyter中splitlines()方法处理三重点号无法返回预期结果
根本原因
这是IPython内核的交互式提示符过滤逻辑导致的,和Python语法本身没有关系:
- 不管是原生Python交互环境还是IPython,都有两级输入提示符:一级提示符标识等待新输入(原生Python是
>>>,IPython默认是In [x]:),二级提示符标识当前处于多行输入/续行状态,默认就是...。 - Jupyter Notebook、Google Colab的代码执行都是依赖IPython内核的,内核在解析你输入的代码单元内容时,会自动把行首出现的、和二级提示符完全匹配的
...判定为环境自动生成的提示符文本,而非用户实际输入的代码内容,直接做过滤删除处理。这就是为什么你三引号字符串里行首的三重点号会消失。 - 当你在标准Python解释器里逐行输入代码、或者直接运行独立的.py脚本时,不存在这个交互式提示符过滤的步骤,所以字符串里的
...会被完整保留,输出和预期一致。
验证方法
你可以在出问题的环境里跑两个简单测试就能确认这个逻辑:
- 不让
...紧贴行首,前面加一个空格,就不会被识别为提示符,输出完全正常:
s = ''' ... .o. ... ''' print(s.splitlines())
- 修改IPython的二级提示符配置,把默认的
...换成其他字符,再跑原代码,三重点号就不会被过滤:
ip = get_ipython() ip.prompts.in2_template = '>> ' s = ''' ... .o. ... ''' print(s.splitlines())
临时规避方案
如果确实需要在多行字符串行首写三个点,选任意一种方式处理即可:
- 行首的
...前加空格,不要让三个点紧贴行开头 - 用转义换行的方式写,比如把开头的换行和三个点写成
'\n...'拼接在字符串前 - 涉及大量这类固定格式文本的场景,直接把内容存在独立文本文件中读取,不要硬编码在交互单元格的多行字符串里
内容的提问来源于stack exchange,提问作者tueda
相关产品推荐
相关产品推荐

