贮存

有时您需要存储有用的信息。此类信息存储为数据:信息的表示(存储在计算机上时以数字形式)。如果您将数据存储在计算机上,它应该会持续存在,即使您关闭并再次打开设备也是如此。

令人高兴的是,micro:bit 上的 MicroPython 允许您使用非常简单的文件系统来执行此操作。由于内存限制,文件系统上 大约有 30k 可用存储空间。

笔记

micropython 文件系统不应与 micro:bit 大容量存储模式混淆,后者将设备呈现为 USB 驱动器。大容量存储模式仅用于跨 HEX 文件复制,因此您不会看到使用出现在 MICROBIT 驱动器上的文件系统创建的文件。

什么是文件系统?

这是一种以持久方式存储和组织数据的方法 - 存储在文件系统中的任何数据都应该在设备重启后继续存在。顾名思义,存储在文件系统上的数据被组织成文件。

../_images/files.jpg

计算机文件是存储在文件系统上的命名数字资源。此类资源包含有用的信息作为数据。这正是纸质文件的工作原理。它是一种包含有用信息的命名容器。通常,纸质文件和数字文件都被命名以表明它们包含的内容。在计算机上,通常以.something后缀结尾文件。通常,“某物”表示使用什么类型的数据来表示信息。例如,.txt表示文本文件、 .jpgJPEG 图像和 .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 对象。

这是重要的一点,包含the next line containing the 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”的文件。

简单的!

笔记

当您打开一个文件并写入时(可能在文件处于打开状态时多次写入)您将写入文件的内容(如果它已经存在)。

如果您想将数据附加到文件中,您应该首先读取它,将内容存储在某处,关闭它,将数据附加到内容中,然后再打开它以使用修改后的内容再次写入。

虽然在 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 (ufs 在命令行中使用时缩写为) 的特殊实用程序。安装和使用 microfs 的所有功能的完整说明可以 在它的文档中找到 。

尽管如此,只需四个简单的命令就可以完成您需要的大部分事情:

$ ufs ls
story.txt

ls子命令列出的文件系统中的文件(这是常见的Unix命令来命名,ls即具有相同的作用)。

$ ufs get story.txt

所述get子命令从所连接的微得到一个文件:位,并将其保存到当前位置的计算机上(它命名后get是这样的普通文件传输协议的一部分的命令[FTP],供应相同的功能)。

$ ufs rm story.txt

rm子命令从连接的 micro:bit 上的文件系统中删除命名文件(它以通用 Unix 命令命名rm, 具有相同的功能)。

$ ufs put story2.txt

最后,该 put 子命令将一个文件从您的计算机放到连接的设备上(它以put作为 FTP 的一部分提供相同功能的命令命名)。

笔记

ufs get 和 put 命令一次只对一个文件进行操作。

主要是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文件了。