【问题标题】:Import .py flie into Jupyter Notebook line by line将 .py 文件逐行导入 Jupyter Notebook
【发布时间】:2018-11-29 09:48:36
【问题描述】:

我更喜欢在 VSCode 上编写我的 Python 代码,因为它具有智能感知和自动完成功能。但我更愿意在 Jupyter 笔记本上查看和调试代码,以更好地可视化我正在处理的数据。

我知道我可以使用神奇的%load%loadpy 命令将任何文件加载到 Jupyter 中。但是他们将整个文件加载到一个单元格中。

由于我想查看某些操作的中间结果,我想以这样一种方式导入文件,即文件上的每一行都分配给笔记本上的一个单元格。除非它是一个函数或条件语句(换句话说,任何带有缩进的东西);在这些情况下,它应该将整个块添加到一个单元格中。

我该怎么做?

【问题讨论】:

  • 对我的回答有什么意见吗?
  • swatchai,很遗憾我还没有时间看你的回答。我会尽快看看。
  • swatchai,我刚刚测试了您的解决方案,它不适用于任何有缩进的代码。
  • 我只是强调了一些暗示问题范围的词。 ;P
  • 糟糕,我的错!让我重新表述一下。 :)

标签: python jupyter-notebook ipython jupyter ipython-magic


【解决方案1】:

AFAIK,在将文件加载到 Jupyter 笔记本时无法执行此操作。但是,您可以使用 ctrl+shift+- 轻松地将大单元格拆分为多个单元格。这将在您当时光标所在的位置拆分您的单元格。

我不知道你的文件有多大,但它是一种非常快速有效的分割单元格的方法,所以也许这对你有用 =)

【讨论】:

  • 不完全是我想要的,但确实是一个有用的提示!谢谢!
【解决方案2】:

您可以使用nbformat 模块以编程方式创建新的 Jupyter 笔记本文件。让我用一个工作代码来演示所有步骤。

以下是 Jupyter 笔记本中的单元格。这个单元格有一个神奇的命令,可以创建一个名为 script001.py 的文件。

%%writefile script001.py
x = 10
print('x is: %s' % x)
y = 20
print('y is: %s' % y)
z = x+y
print('z is: %s' % z)

下面第二个单元格中的代码创建了一个名为 split_cells.ipynb 的新笔记本。

import nbformat as nbf

# create notebook object
nb2 = nbf.v4.new_notebook()

# prep cells' content for the new notebook
code = []
with open('script001.py') as fi:
    for aline in fi:
        code.append(aline.rstrip())

# take each line of code as single cells
nb2['cells'] = [nbf.v4.new_code_cell(ea) for ea in code]

# name of notebook to create
fname = 'split_cells.ipynb'

# create new notebook file
with open(fname, 'w') as fj:
    nbf.write(nb2, fj)

当您打开新笔记本split_cells.ipynb 时,您将拥有如下单元格:

In[]: x = 10

In[]: print('x is: %s' % x)

In[]: y = 20

In[]: print('y is: %s' % y)

In[]: z = x+y

In[]: print('z is: %s' % z)

此笔记本已准备好按您的意愿运行。希望对您有所帮助。

【讨论】:

  • 正如我想象的那样,您的代码仅适用于非常有限和少量的代码。这背后的主要原因是您的代码不支持例如函数的创建。由于它拆分了每一行代码,因此它还拆分了例如函数定义从其主体中。见this print screen here
  • 请进一步想象,因为这可能是一个起点,对于回答这个问题的人来说并没有太多的劳动工作。您不希望有一个完整的可运行代码适用于所有类型的 xxx.py 文件。仅供参考,可以将多行函数分离到一个文件中并导入以在 Jupyter 笔记本上与 single cell 一起使用。
  • 你是对的swatchai。如果您的答案进一步改进,它可能会成为我问题的真正答案。但是,由于它不是正确的答案,只是指出了正确的方向,我不能将其标记为正确的答案。但我将其标记为有用。
  • 事实上,我已经完全解决了您的问题范围。但我认为这对另一个问题有好处。我不想编辑回答不断变化的问题的答案。
猜你喜欢
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多