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

TM9*_*M90 4 python ipython ipython-notebook

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

有没有一种方法可以通过内置函数或类似方法将文本作为字符串获取?

Gra*_*yne 5

我的回答(可能不令人满意)分为两个部分。这是基于对iPython结构的个人调查,完全有可能我错过了一些可以直接回答问题的东西。

本届会议

在当前会话中输入的代码单元的原始文本可在笔记本中使用该列表获取In

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

In[len(In)-1]
Run Code Online (Sandbox Code Playgroud)

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

print "hello world"
three = 1+2
In[len(In)-1]
Run Code Online (Sandbox Code Playgroud)

产生相应的Out[]值:

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

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

但是,如果在上一个Notebook会话期间输入了单元格,随后又关闭并重新打开了该会话,则该单元格将不再起作用。同样,In阵列中似乎仅包含代码单元。

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

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

在我的研究中,我发现从以前的会议中获取原始文本的唯一方法是读取原始笔记本文件。有一个文档页面介绍如何将IPython Notebook作为模块导入。关键代码在In[4]

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

其中current的API实例在模块nbformat.current中描述。

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

    for cell in nb.worksheets[0].cells:
        ...
Run Code Online (Sandbox Code Playgroud)

cell出于这个问题的目的,因此列举的对象具有两个关键字段:

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

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

通过查看构成已保存的iPython笔记本的JSON数据,可以看到很多内容。

除了笔记本中的“提示编号”字段(每当重新评估该字段时似乎都会更改)之外,我都找不到方法来创建对笔记本单元的稳定引用。

结论

我找不到原始问题的简单答案。我发现的内容已在上面介绍。不知道原始问题背后的动机,我不知道这是否足够。

我寻找的但无法识别的是一种可以在笔记本本身内部使用的引用当前笔记本的方式(例如,通过诸如之类的功能get_ipython())。那并不意味着它不存在。

我的回应中另一个缺失的部分是引用特定单元格的任何稳定方式。(例如,查看笔记本文件格式,原始文本单元格仅由单元格类型(“原始”)和原始文本本身组成,尽管看起来还可能包含单元格元数据。)这建议了直接引用a的唯一方法单元格是通过其在笔记本中的位置进行的,但是在编辑笔记本时,主题也会发生变化。

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