前言
jupyter notebook在数据分析和建模领域是一把利器,可以一行一行或者一个cell一个cell看输出结果,把复杂的问题简单化。
每一个变量都是有缓存的,当流程比较复杂的时候,可以直接从某一步重新开始,而不是重头开始,这样就大大提高了效率。
jupyter notebook优点很多,但是因为缓存也可能会改变了原本数据,或者变量的值做了其他改变却不知,当然本文记录的却是其他问题:输出内容太多,导致jupyter notebook中ipynb文件太大而导致文件打不开。
有许多方式可以解决当前问题。
方法一
如果文件还能打开,直接清除输出
Kernel
-->Restart & Clear Output
如果文件打得开手动删除,或者使用方法一都可以,但是棘手的问题是如果文件已经打不开了,改怎么办呢?
方法二
复制一份源代码文件,形成一个新的文件
安装nbconvert插件,在cmd中输入
pip install jupyter_contrib_nbextensions
到要复制的文件目录下,然后复制一份新的源文件
输入以下命令, test.ipynb改为要复制的文件
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --to notebook --output=NotebookNoOut test.ipynb
能看出来新生成的NotebookNoOut.ipynb仅仅只有2.04kB,仅仅保留了源代码。
方法三
还是需要先安装jupyter_contrib_nbextensions插件
直接在ipynb文件上将output删除
jupyter nbconvert --ClearOutputPreprocessor.enabled=True --inplace test.ipynb
同样,test.ipynb改成自己的ipynb文件
方法四
使用记事本打开当前ipynb文件
"cells"后面的内容便是ipynb的所有cell,"outputs"便是显示信息,outputs
中的"text"
便是输出的内容,将[]
中的内容删除,当前的输出信息便成空,只需要找到导致文件打不开的outputs的”text“
后删除即可。
当前方法是比较推荐的方法,毕竟不需要安装任何东西,并且选择性的删除输出内容。
方法五 通过代码提取
import json
with open('test.ipynb', 'r', encoding='utf8')as f:
json_data = json.load(f)
for i in range(len(json_data['cells'])):
tmp = json_data['cells'][i]['source']
print("cell", json_data["cells"][i]["execution_count"])
for j in tmp:
print(j, end = '')
print('\n')
此处提取出来的便是每隔cell的代码了,但是呢ipynb的代码结构却发生了变化,使用起来就不方便了。
如果进一步,保留代码和代码格式该如何处理呢?
既然ipynb是通过某种格式存储的,那么保留存储格式即可,将text后面置为[]即可。
代码:
import json
with open('./Untitled1.ipynb', 'r', encoding='utf8') as f:
json_data = json.load(f)
for cell in json_data['cells']:
if 'outputs' in cell:
for output in cell['outputs']:
if 'text' in output:
output['text'] = []
with open('test-copy.ipynb', 'w', encoding='utf-8') as file:
file.write(json.dumps(json_data, indent=2, ensure_ascii=False))
运行结果
产生一个名为test-copy.ipynb
的文件,使用jupyter notebook打开
和上边的命令得到的结果完全相同,实现了直接所有输出都去掉的功能,这样文件便非常小,可以打开了。
当前方法也是比较推荐的方法,不需要安装任何东西,输出内容的内容可以增加更多的判断,比如输出内容的长度等。