这两天学习block_log修复的问题,大致思路和操作都没问题,现在唯一的问题就是我是用程序计算出偏移量,然后再手工执行truncate
指令来截短block_log以及block_log.index,很明显我们可以完全让程序来做这事。
<p dir="auto"><img src="https://images.hive.blog/DQmeuWMrjYJ81wZjmr7C8XBKgudvJPqiecDr573zHMVaiPo/image.png" alt="image.png" /><br />
(图源 :<a href="https://pixabay.com/illustrations/question-mark-artificial-6786596/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">pixabay)
<p dir="auto">要让程序做这件事,首先要做的就是打开文件获取文件句柄来读写,在之前的文章中,我提过Python读取二进制文件就四个操作:
<ul>
<li>使用<code>open打开文件
<li>使用<code>seek定位位置
<li>使用<code>read读取内容
<li>使用<code>close关闭文件
<p dir="auto">而读取时,我们要给open函数传入模式(mode)标识<code>r(代表读取)以及<code>b(代表二进制),也就是说,读取block_log.index文件,需要使用类似如下代码打开:
<blockquote>
<p dir="auto"><code>f = open('block_log.index', 'rb')
<p dir="auto">那么我们要写文件是不是应该用,以下代码了?
<blockquote>
<p dir="auto"><del><code>f = open('block_log.index', 'wb')
<p dir="auto">话说从业N多年以来,没少和文件打交道,我直觉认为就应该是这样,毕竟<code>r和<code>w对应,一个读一个写,多完美,多优雅。似乎好多好多年前,我也是这样学的。
<p dir="auto">然而看了Python参考手册中关于模式的信息,发现我真的是大错特错呢:
<details><summary>Reveal spoiler<p dir="auto"><img src="https://images.hive.blog/DQmWaxwNY6nKJJiHu7EBeyeSxG7fG5zMq1YEtK54mYaNEvs/image.png" alt="image.png" />
<p dir="auto">注意到其中关于<code>w的解释了吗:
<blockquote>
<p dir="auto">open for writing, truncating the file first
<p dir="auto">作为写模式打开是没错,不过先彻底截短文件!也就是说,如果我用这个<code>w来操作block_log,那它就彻底清空了。500G的文件彻底清空,估计我可以哭了。
<p dir="auto">比如下面这段代码,就可以“帮你”彻底清空block_log,<strong><em>千万不要试哦:
<blockquote>
<p dir="auto"><code>fd = open('block_log', 'wb')<br />
<code>fd.close()
<p dir="auto">所以,根据上边的模式表,要对文件进行<strong><em>二进制读写,正确的打开方式应该是:
<blockquote>
<p dir="auto"><code>f = open('block_log.index', 'ab+')
<p dir="auto">好了,读写的问题解决了,可是为啥我记错了呢?后来我想了想,可能是我把Python和C语言记混淆了,毕竟以前用C比较多。可是查了一下,C和C++的读写模式基本上都和Python类似。
<p dir="auto"><img src="https://images.hive.blog/DQmZrWTaCE6uuHLP21SuvPUbJBvmCtzLeMazRnkyZHPDw7P/image.png" alt="image.png" /><br />
(图源 :<a href="https://pixabay.com/illustrations/binary-code-privacy-policy-brain-5137349/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">pixabay)
<p dir="auto">好吧,应该是我的记忆出偏差了,这让我想起了曼德拉效应:
<blockquote>
<p dir="auto">曼德拉效应(英文名:The Mandela Effect)是一个心理学效应,指大众对历史的集体记忆与史实不符。主流科学界没有科学研究证明这一“效应”的真实性。
<p dir="auto">关于曼德拉效应常见的例子有曼德拉是上世纪八九十年代在监狱中死亡还是2013年才去世?讲真2013年听到曼德拉去世的消息我也很震惊,他不是早就去世了吗?Beyond的《光辉岁月》不就唱的他的事迹吗?
<p dir="auto">还有《西游记》中有没有羊力大仙下油锅的场景,我记得很清楚那油还在翻滚冒泡呢。
<p dir="auto">类似的还有许多许多,就不一一列举了,大家可以看文末的百度百科链接来参考。
<p dir="auto">关于曼德拉效应引发的一个思考就是到底是我们的世界被篡改了还是我们的记忆被篡改了?就好比我在文件读写中遇到的<code>w模式这个问题。
<p dir="auto"><img src="https://images.hive.blog/DQmbZXWVakch6boM3Fpjyp6Gvg6P2A2UzVUH2xxTbRifAHz/image.png" alt="image.png" /><br />
(图源 :<a href="https://pixabay.com/illustrations/artificial-intelligence-brain-think-3382507/" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">pixabay)
<p dir="auto">后来想想,别的事情有没有篡改我不确定,这个<code>w模式,八成、大概、可能主要就是我学艺不精,哈哈哈哈哈。
<h1>相关链接
<ul>
<li><a href="https://baike.baidu.com/item/%E6%9B%BC%E5%BE%B7%E6%8B%89%E6%95%88%E5%BA%94/20374535" target="_blank" rel="noreferrer noopener" title="This link will take you away from hive.blog" class="external_link">曼德拉效应
👍
我一直以为曼德拉还活着😂
我好崇拜O神哥这样IT神,太厉害啦👍
之前是看过一个视频,到底是记忆出错还是真的事实被篡改,那个皮卡丘的尾巴上面是否有黑色条纹?真的有点玄乎!🤣🤣🤣
这简直不是人类能懂的。O哥脑子是怎么长的,这么厉害。
我看得头大。