贮存¶
有时您需要存储有用的信息。此类信息存储为数据:信息的表示(存储在计算机上时以数字形式)。如果您将数据存储在计算机上,它应该会持续存在,即使您关闭并再次打开设备也是如此。
令人高兴的是,micro:bit 上的 MicroPython 允许您使用非常简单的文件系统来执行此操作。由于内存限制,文件系统上 大约有 30k 可用存储空间 。
笔记
micropython 文件系统不应与 micro:bit 大容量存储模式混淆,后者将设备呈现为 USB 驱动器。大容量存储模式仅用于跨 HEX 文件复制,因此您不会看到使用出现在 MICROBIT 驱动器上的文件系统创建的文件。
什么是文件系统?
这是一种以持久方式存储和组织数据的方法 - 存储在文件系统中的任何数据都应该在设备重启后继续存在。顾名思义,存储在文件系统上的数据被组织成文件。
计算机文件是存储在文件系统上的命名数字资源。此类资源包含有用的信息作为数据。这正是纸质文件的工作原理。它是一种包含有用信息的命名容器。通常,纸质文件和数字文件都被命名以表明它们包含的内容。在计算机上,通常以.something
后缀结尾文件。通常,“某物”表示使用什么类型的数据来表示信息。例如, .txt
表示文本文件、
.jpg
JPEG 图像和 .mp3
编码为 MP3 的声音数据。
某些文件系统(例如笔记本电脑或 PC 上的文件系统)允许您将文件组织到目录中:将相关文件和子目录组合在一起的命名容器。但是,MicroPython 提供的文件系统是平面文件系统。平面文件系统没有目录——您的所有文件都存储在同一个地方。
Python 编程语言包含易于使用且功能强大的方法来处理计算机的文件系统。micro:bit 上的 MicroPython 实现了这些功能的一个有用子集,以便在设备上轻松读写文件,同时还提供与其他 Python 版本的一致性。
警告
闪烁你的 micro:bit 会破坏你所有的数据,因为它会重写设备使用的所有闪存,并且文件系统存储在闪存中。
但是,如果您关闭设备,数据将保持不变,直到您将其删除或重新刷新设备。
芝麻开门¶
文件系统上的文件读写是通过该open
函数实现的。打开文件后,您可以对其进行操作,直到将其关闭(类似于我们使用纸质文件的方式)。关闭文件很重要,以便 MicroPython 知道您已经完成了它。
确保这一点的最佳方法是使用如下 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
语句关联的代码块只是读取文件的一行。一旦与
with
语句关联的代码块 关闭,Python(和 MicroPython)将自动为您关闭文件。这称为上下文处理,该open
函数创建作为文件上下文处理程序的对象。
简而言之,与文件交互的范围由与 with
打开文件的语句相关联的代码块定义。
使困惑?
别这样 我只是说你的代码应该是这样的:
with open('some_file') as some_object:
# Do stuff with some_object in this block of code
# associated with the with statement.
# When the block is finished then MicroPython
# automatically closes the file for you.
就像纸质文件一样,打开数字文件有两个原因:读取其内容(如上所示)或向文件写入内容。默认模式是读取文件。如果你想写入一个文件,你需要
open
通过以下方式告诉 函数:
with open('hello.txt', 'w') as my_file:
my_file.write("Hello, World!")
请注意,该 'w'
参数用于将my_file
对象设置为写入模式。您还可以传递一个'r'
参数来将文件对象设置为读取模式,但由于这是默认设置,因此通常会被忽略。
将数据写入文件是使用(您猜对了)write
方法完成的,该方法将您要写入文件的字符串作为参数。在上面的例子中,我写了文本“Hello, World!” 到一个名为“hello.txt”的文件。
简单的!
笔记
当您打开一个文件并写入时(可能在文件处于打开状态时多次写入),如果文件已经存在,您将写入 OVER 文件的内容。
如果您想将数据附加到文件中,您应该首先读取它,将内容存储在某处,关闭它,将数据附加到内容中,然后再打开它以使用修改后的内容再次写入。
虽然在 MicroPython 中就是这种情况,但“普通”Python 可以在“追加”模式下打开文件进行写入。我们不能在 micro:bit 上做到这一点是文件系统简单实现的结果。
操作系统¶
除了读取和写入文件,Python 还可以操作它们。您当然需要知道文件系统上有哪些文件,有时还需要删除它们。
在普通计算机上,操作系统(如 Windows、OSX 或 Linux)的角色是代表 Python 管理它。此类功能在 Python 中通过名为os
. 由于 MicroPython是操作系统,我们决定在os
模块中保留适当的函数以保持一致性,因此当您在笔记本电脑或 Raspberry Pi 等设备上使用“常规”Python 时,您将知道在哪里可以找到它们。
本质上,您可以执行三个与文件系统相关的操作:列出文件、删除文件和询问文件大小。
要列出文件系统上的文件,请使用该listdir
函数。它返回一个字符串列表,指示文件系统上文件的文件名:
import os
my_files = os.listdir()
要删除文件,请使用该remove
功能。它需要一个表示要删除的文件的文件名的字符串作为参数,如下所示:
import os
os.remove('filename.txt')
最后,有时在读取文件之前知道文件有多大很有用。要实现这一点,请使用该size
功能。与remove
函数一样,它接受一个字符串,表示您想知道其大小的文件的文件名。它返回一个整数(整数),告诉您文件占用的字节数:
import os
file_size = os.size('a_big_file.txt')
拥有文件系统固然很好,但如果我们想在设备上或从设备上放置或获取文件怎么办?
只需使用该 microfs
实用程序!
文件传输¶
如果您在用于对 BBC micro:bit 进行编程的计算机上安装了 Python,那么您可以使用一个名为的特殊实用程序microfs
(shortened to
ufs
在命令行中使用时缩写为 )。安装和使用 microfs 的所有功能的完整说明可以
在它的文档中找到 。
尽管如此,只需四个简单的命令就可以完成您需要的大部分事情:
$ ufs ls
story.txt
该 ls
子命令列出的文件系统中的文件(这是常见的Unix命令来命名,ls
即具有相同的作用)。
$ ufs get story.txt
该 get
子命令从连接的 micro:bit 获取文件并将其保存到您计算机上的当前位置(它以get
命令命名,该命令是通用文件传输协议 [FTP] 的一部分,具有相同的功能)。
$ ufs rm story.txt
所述 rm
子命令从所连接的微文件系统指定的文件:位(它是常见的Unix命令来命名,rm
即具有相同的作用)。
$ ufs put story2.txt
最后 put
子命令将文件从您的计算机放到连接的设备上(它以put
作为 FTP 的一部分提供相同功能的命令命名)。
主要是main.py¶
文件系统还有一个有趣的特性:如果你只是将 MicroPython 运行时刷到设备上,那么当它启动时,它只是在等待一些事情做。但是,如果您将调用的特殊文件复制main.py
到文件系统上,则在重新启动设备时,MicroPython 将运行该main.py
文件的内容。
此外,如果您将其他 Python 文件复制到文件系统上,那么您可以
import
像复制 任何其他 Python 模块一样使用它们。例如,如果您有一个hello.py
包含以下简单代码的文件:
def say_hello(name="World"):
return "Hello, {}!".format(name)
…你可以say_hello
像这样导入和使用这个函数:
from microbit import display
from hello import say_hello
display.scroll(say_hello())
当然,它的结果是文本“Hello, World!” 在显示屏上滚动。重要的一点是,这样的示例被拆分为两个 Python 模块,并且该 import
语句用于共享代码。
笔记
如果除了 MicroPython 运行时之外,您已将脚本刷入设备,则 MicroPython 将忽略main.py
并运行您的嵌入式脚本。
要仅刷新 MicroPython 运行时,只需确保您在编辑器中编写的脚本中包含零个字符。刷完后,您就可以复制 main.py
文件了。