大学开学,网课在家。最近有门课要求使用Jupyter Notebook来写python的程序。但是因为笔者家里的破电脑开个浏览器都要卡半天,有的时候懒得去启动Jupyter Notebook,就图省事想直接用记事本打开编辑一下代码。然后就……报错!
一开始还以为是不小心动了什么东西,查了一下网页大部分结果都说是破坏了json的结构什么的,也有道理。然而,我把文件文本丢给json检测是通过的。这就很神奇了,要不我什么都不动就打开-保存-关闭?发现结果依旧是这样。
细心的同学可能发现了,这个文件怎么是以\ufeff开头的?之前没动过的文件有这个吗?于是,我做了一个实验,使用Jupyter Notebook新建了一个ipynb文件……
之后保存为Untitled.ipynb,并复制一份为Untitled2.ipynb。用记事本打开Untitled2.ipynb,不做任何编辑,保存,关闭。
结果也在预料之中,Untitled.ipynb能正常在Jupyter Notebook中打开,而Untitled2.ipynb就报错了。
为了查找原因与“修复文件”的方法,我在同目录下试着用python读了一下两个文件。简单的代码如下
f=open("Untitled.ipynb","r",encoding="utf-8") g=open("Untitled2.ipynb","r",encoding="utf-8") a=f.read() b=g.read()
最后的变量a与b中的值分别为:
a='{\n "cells": [\n {\n "cell... b='\ufeff{\n "cells": [\n {\n "cell...
看出来了吗?b中开头多了\ufeff,这是表示编码的字节序的一个标识。可是通常来说,UTF-8是可以标明字节顺序的,当然通常也不需要标明,不像其他的编码有大小端的因素。而win7记事本在保存的时候,认为这是UTF-8编码的文本文件,于是就在开头加了\ufeff(来告诉之后访问这个文本的记事本这是个UTF-8写的东西)。而Jupyter Notebook(Win7环境,Win10似乎没问题)似乎不吃这套,它从来不写\ufeff,也看不懂,于是就报错了。这和记事本的“写”、“联通”bug有异曲同工之妙。
那原因知道了,怎么修复呢?其实十分简单,去掉开头不就好了嘛。简单用python整了这么一段:
g=open("Untitled2.ipynb","r",encoding="utf-8") h=open("FixedUntitled2.ipynb","w",encoding="utf-8") h.write(g.read()[1:]) h.close() g.close()
这样FixedUntitled2.ipynb又可以被Jupyter Notebook识别了,我们的问题也就解决了。