关于win7记事本的一个坑

大学开学,网课在家。最近有门课要求使用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识别了,我们的问题也就解决了。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

图片 表情