前情提要:本博客仅针对在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 |
在源文件已经删除了该字符串。