IPython笔记本从原始文本单元格读取字符串

时间:2014-10-18 13:48:36

标签: python ipython ipython-notebook

我的IPython笔记本项目中有一个原始文本单元格。

有没有办法将文本作为带有内置函数或类似内容的字符串?

2 个答案:

答案 0 :(得分:3)

我的(可能不满意)答案分为两部分。这是基于对iPython结构的个人调查,而且我完全有可能错过了更直接回答问题的内容。

当前会话

使用列表In在笔记本中提供了在当前会话期间输入的 原始文本

因此,当前单元格的原始文本可以通过单元格中的以下表达式返回:

In[len(In)-1]

例如,评估包含此代码的单元格:

print "hello world"
three = 1+2
In[len(In)-1]

产生相应的Out[]值:

u'print "hello world"\nthree = 1+2\nIn[len(In)-1]'

因此,在活动的笔记本会话中,您可以将单元格的原始文本作为In[n]访问,其中n是所需单元格的显示索引。

但是如果在之前关闭并重新打开的上一个Notebook会话期间输入了单元格,则该单元格不再有效。此外,只有代码单元格似乎包含在In数组中。

此外,这对非代码单元格不起作用,因此不适用于原始文本单元格。

保存的笔记本会话中的单元格

在我的研究中,我能够发现从以前的会话中获取原始文本的唯一方法是阅读原始的笔记本文件。有一个文档页面Importing IPython Notebooks as Modules描述了如何执行此操作。密钥代码位于In[4]

    # load the notebook object
    with io.open(path, 'r', encoding='utf-8') as f:
        nb = current.read(f, 'json')

其中currentModule: nbformat.current所述API的实例。

返回的笔记本对象作为嵌套字典和列表结构进行访问,例如:

    for cell in nb.worksheets[0].cells:
        ...

这样列举的cell个对象有两个关键字段用于此问题:

  1. cell.cell_type是单元格的类型(“代码”,“降价”,“原始”等)。

  2. cell.input是单元格的原始文本内容,作为字符串列表,每行文本都有一个条目。

  3. 通过查看构成已保存的iPython笔记本的JSON数据,可以看到大部分内容。

    除了笔记本中的“提示编号”字段,无论何时重新评估该字段时,我都无法创建对笔记本单元格的稳定引用。

    结论

    我找不到原始问题的简单答案。我发现的内容如上所述。在不知道原始问题背后的动机的情况下,我不知道它是否足够。

    我查找但无法识别的是一种引用当前笔记本的方法,该笔记本可以在笔记本内部使用(例如通过像get_ipython()这样的功能)。这并不意味着它不存在。

    我的回答中另一个缺失的部分是任何一种引用特定细胞的稳定方式。 (例如,查看笔记本文件格式,原始文本单元格仅由单元格类型(“原始”)和原始文本本身组成,但看起来也可能包含单元格元数据。)这表明直接引用的唯一方法单元格是通过它在笔记本中的位置,但在编辑笔记本时,这个位置会发生变化。

    (作为牛津参与http://aaronswartzhackathon.org的一部分研究和回答)

答案 1 :(得分:1)

由于我缺乏声誉,我不能发表评论所以我只会发布Graham Klyne答案的更新答案,以防其他人偶然发现这一点。 (Ipython迄今尚未更新文档)

  1. 使用nbformat而不是Ipython.nbformat.current
  2. 工作表属性已消失,因此请直接使用单元格。
  3. 我有一个更新代码如下所示的示例: https://github.com/ldiary/marigoso/blob/master/marigoso/NotebookImport.py