存储
有时你需要保存有用信息。这类信息以数据的形式存在——信息的数字化表示。在计算机上保存的数据,即使关机再开机,也应该还在。
好在 micro:bit 上的 BiBoPython 提供了非常简单的文件系统。受内存限制,文件系统大约只有 30KB 可用空间。
什么是文件系统?
文件系统是一种持久保存和组织数据的方式——存在上面的数据在设备重启后仍在。顾名思义,数据以文件的形式组织。

计算机上的文件是文件系统里具名的数字资源,里面装着有用的数据。这和纸质档案很像:一个带名字的容器,装着有用信息。纸质和数字文件通常都会起名,让人知道里面是什么。在计算机上,文件名常以 .后缀 结尾;后缀往往表示数据的类型,例如 .txt 是文本,.jpg 是 JPEG 图像,.mp3 是 MP3 音频。
有些文件系统(比如你电脑上的)允许用目录把相关文件和子目录分组。但 BiBoPython 提供的是扁平文件系统——没有目录,所有文件都在同一层。
Python 语言提供了强大且易用的文件系统操作。micro:bit 上的 BiBoPython 实现了其中有用的一部分,便于读写,也与其他 Python 环境保持一致。
芝麻开门
读写文件用 open 函数。打开文件后可以操作,用完后要关闭——就像使用纸质档案一样。务必关闭,BiBoPython 才知道你用完了。
最稳妥的方式是用 with 语句:
with open('story.txt') as my_file:
content = my_file.read()
print(content)
with 通过 open 打开文件并赋给一个对象。上面例子中,open 打开名为 story.txt 的文件(显然是某种故事文本)。在 Python 代码里代表这个文件的对象叫 my_file。在 with 下面缩进的代码块里,用 my_file.read() 读取内容并赋给 content。
关键一点:包含 print 的那一行没有缩进。与 with 关联的代码块只有读取文件的那一行。该代码块结束后,Python(和 BiBoPython)会自动关闭文件。这叫上下文管理;open 创建的对象就是文件的上下文管理器。
简单说:你操作文件的范围,由打开它的 with 语句所关联的代码块决定。
还不清楚?代码结构应像这样:
with open('some_file') as some_object:
# 在 with 关联的代码块里用 some_object 做事
# 代码块结束后,BiBoPython 会自动关闭文件
和纸质档案一样,打开数字文件通常有两种目的:读内容(如上),或写入内容。默认是读模式。若要写入,需要告诉 open:
with open('hello.txt', 'w') as my_file:
my_file.write("Hello, World!")
注意参数 'w' 把 my_file 设为写入模式。也可传 'r' 表示读模式,但读是默认,常可省略。
写入用 write 方法,参数是要写入的字符串。上面例子向 hello.txt 写入了 "Hello, World!"。
很简单!
OS SOS
除了读写,Python 还能管理文件——你需要知道文件系统里有哪些文件,有时也要删除。
在普通电脑上,由操作系统(Windows、macOS、Linux 等)代劳;BiBoPython 本身就扮演操作系统角色,为保持一致,相关功能放在 os 模块里——以后在笔记本或树莓派上用「完整版」Python 时,也知道去哪找。
本质上,与文件系统相关的操作有三种:列出文件、删除文件、查询文件大小。
列出文件用 listdir:
import os
my_files = os.listdir()
删除文件用 remove,传入要删的文件名字符串:
import os
os.remove('filename.txt')
读取前有时需要知道文件多大,用 size,同样传入文件名,返回文件占用的字节数(整数):
import os
file_size = os.size('a_big_file.txt')
有了文件系统,怎样把文件放进设备或取出来?
日常请在 比卜创造 Python 编辑器 或 比卜创造 App 里编写、保存并烧录。编辑器会把项目中的 .py 等文件传到micro:bit上,无需安装其它第三方工具。
主要是 main.py
文件系统还有一个有趣特性:若你只烧录了 BiBoPython 运行时,设备启动后会等待指令;但若在文件系统里放入名为 main.py 的特殊文件,重启后 BiBoPython 会自动运行 main.py 里的代码。
此外,把其他 Python 文件拷到文件系统后,可以像普通模块一样 import。例如 hello.py 里有:
def say_hello(name="World"):
return "Hello, {}!".format(name)
可以这样用:
from bibo import display
from hello import say_hello
display.scroll(say_hello())
屏幕上会滚动 "Hello, World!"。要点是:示例拆成两个模块,用 import 共享代码。