前情提要:本博客仅针对在PyCharm中使用jupyter的重度用户。

由于我本身喜欢jupyter的这种独立运行结构,可以很好的进行代码的调试,互相并不影响。故初期我是使用jupyter notebook的,但jupyter notebook的代码提示说实话并不是很好,也不够流畅。故后面我转战了Pycharm,现在的感觉就是Pycharm真香。

在PyCharm中使用建立ipynb文件,使用体验还算不错。逐渐我也基本使用ipynb来代替py文件。但近期我也发现了一个问题,就是在实现一个稍大一点的项目文件时,需要将其封装为一个模块,来供之后的文件调用。而ipynb文件不能当作包来调用,故需先将其转换为py文件。

重点来了,起初我都是人工转换😂,每个cell全选幅值粘贴,但这样一旦ipynb文件的cell多了起来,就比较麻烦。于是下面将介绍如何利用PyCharm终端,实现对ipynb文件的转换。

PyCharm终端替换为Git Bash

打开PyCharm,打开setting(设置)->tool(工具)->terminal(终端),如下图:

在Shell路径中,默认一般是CMD,只要将其替换成“D:\Git\bit\sh.exe” —login,便可以将终端换为bash。这个是bash安装的文件路径,替换成自己便可以了。注意不要漏掉login,否则不会在终端中集成,而是会弹出窗口。

ipynb转换为py文件

这一步较为简单,只需要运行一条命令,但注意首先需要进入该ipynb文件的文件目录,然后再运行命令,否则可能找不到文件。命令如下:

1
jupyter nbconvert --to script myprogram.ipynb

执行成功后,会在该文件目录发现与ipynb文件同名的py文件,例如上述命令就会产生一个myprogram.py文件。

执行成功后,如上图所示。

很多博客到这里就结束了,但奈何本人是个强迫症,这样转换后的py文件有一个小问题,就是它仍存在ipynb里面cell的In[1],就和下面一样:

强迫症的我这能忍的了?但奈何网上也没有针对这个的特效方法,于是我便想能否读取py文件,对这几个字符进行匹配,将其换为空字符或者空格。

批量替换In[1]

在这里我使用linux中的sed命令。sed全名叫stream editor,流编辑器,用程序的方式来编辑文本。sed基本上就是玩正则模式匹配,由于我也是临时发现有这么一个东西,所以也还并不熟练使用它,在这里就不详细介绍了,google有很多更详细的教程。

1
sed [option] 'command' input_file

在这里由于我们是要替换掉这些多余的字符,故使用sed s替换脚本命令。其基本用法如下:

1
sed 's/原字符串/替换字符串/'

现在我们只需要将原字符串表达出来,将替换字符串为空,便可以实现删除。

现在我们看看要删除的字符,它的形式是这样的:“# In[num]:”,中括号中间为一个数字。

那么可以写出一个正则表达式来匹配它,如下:

1
"# In\[[1-9].*\]"

其中\可以实现对[]的转义,[1-9]表示可以匹配1到9中任意一个数字,而 . 可以代表任意一个字符(除换行符),m 表示可以匹配出现任意次m的字符串。故 [1-9].表示可以匹配一个以1-9中数字开头,以出现任意次的任意字符的字符串。

执行命令如下:

1
sed 's/# In\[[1-9].*\]/ /' model.py

结果如下:

在终端上会打印出model.py的内容,可以发现“# In[num]:”字符串已经没有了。但看model.py文件,可以发现它并没有修改。

这是因为sed命令若没有指定模式,其输出的只是位于缓存区的内容,并不会直接修改源文件。而修改源文件只需要加上-i。

1
sed -i 's/# In\[[1-9].*\]/ /' model.py

在源文件已经删除了该字符串。