Skip to content

Latest commit

 

History

History
770 lines (554 loc) · 30.6 KB

File metadata and controls

770 lines (554 loc) · 30.6 KB

十一、与文件系统交互

在本章中,我们将介绍一些与文件系统交互相关的方法。第一个方法将涉及如何在需要重新安装文件系统的设备上重新安装文件系统,然后才能使用 Python 代码修改任何文件。

然后,将介绍列出、删除和创建文件的方法。此外,还将介绍更高级的主题,如计算磁盘使用率。本章中的方法将为您提供向嵌入式项目添加文件系统交互所需的工具。当您希望将传感器数据记录到一个文件中,或者当您希望代码读取一组文件并将其加载到数据结构中时,这会很方便。当您必须列出要在应用程序中显示的一组图像时,它也会很有帮助。

在本章中,我们将介绍以下配方:

  • 重新安装文件系统
  • 列表文件
  • 删除文件
  • 创建目录
  • 读取文件内容
  • 写入文件内容
  • 计算磁盘使用率

技术要求

本章的代码文件可在本书 GitHub 存储库的Chapter11文件夹中找到,可在上找到 https://github.com/PacktPublishing/MicroPython-Cookbook

本章中的所有配方都使用了 Python 3.1.2。

重新安装文件系统

这个方法将向您展示如何重新安装文件系统,以便它可以从 Python 脚本中写入数据。某些电路板,如 Circuit Playway Express,默认情况下会将连接的设备作为 USB 驱动器公开,以便于编辑和保存代码。然而,这种方法的折衷之处在于,Python 代码无法写入或更改主板存储上的任何内容。在这些主板上,您必须重新安装文件系统,以允许脚本将数据写入其文件系统。

在本教程结束时,您将知道如何允许将数据写入文件系统,以及如何恢复更改,这对于某些项目至关重要。例如,如果您想使用 Circuit Playway Express 将温度读数记录到日志文件中,则需要使用这种方法。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。

怎么做。。。

按照以下步骤学习如何重新安装文件系统:

  1. 在 REPL 中运行以下代码行:
>>> f = open('main.py')
  1. Python 代码能够打开一个文件进行读取。但是,如果您尝试打开一个文件进行写入,如下面的代码块所示,您将得到一个OSError实例,因为文件系统处于只读模式:
>>> f = open('hi.txt', 'w')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: 30
>>>
  1. 现在,我们将创建一个脚本,该脚本将重新装载文件系统,以允许读取和写入数据。
  2. 以下代码应保存到boot.py文件中。如果文件不存在,则必须创建它:
import storage
storage.remount('/', False)
  1. 从计算机中弹出CIRCUITPY驱动器。
  2. 从计算机上拔下电路板。
  3. 将电路板重新连接到计算机。
  4. 在 REPL 中运行以下代码行,以确认您的代码可以将数据写入电路板存储器上的文件:
>>> f = open('hi.txt', 'w')
>>> f.write('hi there')
8
>>> f.close()
  1. 在 REPL 中运行以下代码块时,将删除boot.py文件:
>>> import os
>>> os.remove('boot.py')
  1. 要将这些更改应用于引导过程,请再次从计算机中弹出CIRCUITPY驱动器。
  2. 从计算机上拔下电路板。
  3. 将电路板重新连接到计算机。
  4. 您应该能够编辑并保存main.py文件的内容,就像您之前所做的那样。

它是如何工作的。。。

Circuit Playplace Express 为您提供了一种从 Python 脚本读取和写入存储器的方法。我们将代码放在boot.py文件中,因为这个脚本将在启动过程的早期运行,在main.py文件之前(包括我们的主代码库)。

boot.py脚本中,我们导入storage模块,然后调用其remount函数,第二个参数设置为False,表示文件系统应该以读写模式挂载。每当我们对boot.py文件进行更改时,无论是创建还是删除该文件,我们都必须通过拔下并重新连接电路板,在电路板上进行硬重置,以使更改生效。如本配方所示,恢复此更改的最简单方法是从 REPL 中删除boot.py文件。

还有更多。。。

一般来说,只有提供 USB 驱动器编辑功能的主板才需要重新安装文件系统这一额外步骤。例如,ESP8266 没有 USB 驱动器功能,因此不需要此步骤。还需要注意的是,一旦启用从代码写入文件系统,就无法在文本编辑器中编辑main.py文件。每当你想重新编辑你的代码时,你必须删除boot.py文件。如果您的项目只需要对文件系统进行只读访问,以执行诸如列出文件和读取文件内容之类的操作,那么您可以在任一模式下安全地运行它。

另见

以下是有关此配方的一些参考资料:

列表文件

本食谱将向您展示如何在 MicroPython 中列出文件和目录。我们还将展示一些技术,您可以使用这些技术来过滤列表,使其仅包含文件或目录。一旦您能够以这种方式与文件系统交互,就可以在您自己的项目中使用它,您的代码将接受板上的文件动态列表,而不需要在程序中硬编码。通过这种方式,这些文件可能表示您要播放的一组可配置音频文件,或者您将在附加屏幕上显示的一组图像。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。

怎么做。。。

按照以下步骤学习如何列出文件:

  1. 在 REPL 中执行以下代码块:
>>> import os
>>> os.listdir()
['.fseventsd', '.metadata_never_index', '.Trashes', 'boot_out.txt', 'main.py', 'lib']
  1. 将生成顶级文件夹中所有文件和目录的列表。以下代码块将生成相同的列表,但已排序:
>>> sorted(os.listdir())
['.Trashes', '.fseventsd', '.metadata_never_index', 'boot_out.txt', 'lib', 'main.py']
  1. 我们还可以列出特定目录中的文件,如以下代码块所示:
>>> os.listdir('.fseventsd')
['no_log']
  1. 以下代码块将检查并显示lib路径不是文件:
>>> FILE_CODE  = 0x8000
>>> 
>>> os.stat('lib')[0] == FILE_CODE
False
  1. 我们现在确认main.py被检测为文件:
>>> os.stat('main.py')[0] == FILE_CODE
True
  1. 以下代码块定义并调用两条路径上的isfile函数,以验证其类型:
>>> def isfile(path):
...     return os.stat(path)[0] == FILE_CODE
...     
...     
... 
>>> isfile('lib')
False
>>> isfile('main.py')
True
>>> 
  1. 以下代码块将列出根路径中的所有文件:
>>> files = [i for i in sorted(os.listdir()) if isfile(i)]
>>> files
['.Trashes', '.metadata_never_index', 'boot_out.txt', 'main.py']
  1. 现在,我们将列出根路径中的所有目录:
>>> dirs = [i for i in sorted(os.listdir()) if not isfile(i)]
>>> dirs
['.fseventsd', 'lib']
  1. 以下代码应放入main.py文件中:
import os

FILE_CODE = 0x8000

def isfile(path):
    return os.stat(path)[0] == FILE_CODE

def main():
    files = [i for i in sorted(os.listdir()) if isfile(i)]
    print('files:', files)
    dirs = [i for i in sorted(os.listdir()) if not isfile(i)]
    print('dirs:', dirs)

main()

执行时,此脚本将打印出根路径中文件和目录的排序列表。

它是如何工作的。。。

导入os模块后,定义一个名为isfile的函数,根据提供的路径是文件还是目录返回TrueFalse。定义并调用main函数,然后生成路径名列表。第一个列表将检索已排序的路径列表,然后过滤该列表,以便仅保留文件。然后打印此列表。然后采用相同的方法获取目录列表并将其打印出来。

还有更多。。。

这个方法引入了许多技术,在处理文件时可以派上用场。它显示默认情况下文件列表不会按字母顺序返回,因此如果需要,可以使用内置的sorted函数对文件列表进行排序。它还定义了一个名为isfile的函数,用于检查特定路径是否为文件。如果需要,您可以创建一个等效的isdir函数。该配方还展示了一种简单的方法,即使用列表理解过滤掉默认列表,以生成只包含特定类型的条目(如文件或目录)的路径的过滤列表。

另见

以下是有关此配方的一些参考资料:

删除文件

本食谱将向您展示如何在 MicroPython 中删除文件和目录。删除文件和删除目录有单独的功能。我们将向您展示如何为每种类型的路径调用这些不同的函数。然后,我们将向您展示如何创建一个可以自动删除任一类型路径的通用函数。

在您创建的项目中,有许多情况需要删除文件。您可以创建一个将数据记录到文件中的项目。日志旋转是一种机制,允许您定期创建新日志文件并自动删除旧日志文件。您将需要删除文件的函数来实现日志轮换。在许多 MicroPython 嵌入式项目中,删除文件以节省空间的问题变得更加重要,因为您经常要处理这些板上有限的存储容量。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。确保您已经完成了本章的重新安装文件系统方法,因为您需要对存储系统进行写访问才能删除文件。

怎么做。。。

按照以下步骤学习如何删除文件:

  1. 在根路径中创建一个名为hi.txt的文件。
  2. 使用 REPL 运行以下代码行:
>>> import os
>>> os.remove('hi.txt')
  1. hi.txt文件现在已从董事会文件系统中删除。运行以下代码块。由于该文件已不存在,因此应经历异常:
>>> os.remove('hi.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file/directory
>>> 
  1. 在根路径中创建一个名为mydir的目录。
  2. 以下代码块将删除mydir目录:
>>> os.rmdir('mydir')
  1. 以下代码块定义了isfile功能:
>>> FILE_CODE = 0x8000
>>> 
>>> def isfile(path):
...     return os.stat(path)[0] == FILE_CODE
...     
...     
... 
>>>
  1. 我们现在可以定义一个名为any_remove的函数,该函数将删除任何类型的路径:
>>> def any_remove(path):
...     func = os.remove if isfile(path) else os.rmdir
...     func(path)
...     
...     
... 
>>> 
  1. 创建一个名为hi.txt的文件和一个名为mydir的目录。
  2. 运行以下代码块:
>>> any_remove('hi.txt')
>>> any_remove('mydir')
>>> 

前面的代码块现在已使用相同的函数调用删除了此文件和目录。

它是如何工作的。。。

首先定义的any_remove函数采用路径并设置一个名为func的变量。此变量将存储删除提供的路径所需调用的可调用项。检查路径类型,并根据提供的路径类型将func设置为os.removeos.rmdir。然后使用提供的路径调用此函数以执行实际删除。

还有更多。。。

此配方引入了一种技术,您可以使用该技术创建一个方便函数,该函数接受任何类型的路径,并将调用正确的底层函数来删除它。需要记住的一点是,您只能删除空目录。此配方中的函数和示例支持删除空目录,但如果使用包含文件的目录调用,则将失败。您可以扩展delete函数来进行递归目录列表,然后删除所有子文件夹和目录。

另见

以下是有关此配方的一些参考资料:

创建目录

此配方将向您展示如何在 MicroPython 中创建目录。我们还将向您展示如何创建一个可以使用同一路径多次调用的函数,并且只在目录不存在时创建一个目录。然后,我们将定义一个类似于makedirs函数的函数,它是 Python 标准库的一部分,但不包含在 MicroPython 中。

当您需要创建可能需要创建特定目录树的项目,然后使用特定的文件集填充该项目时,这些功能集非常有用。当您在诸如 ESP8266 之类的板上工作时,它也有助于访问这些函数,这只允许您通过 REPL 和 Python 代码创建所需的目录。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。确保您已完成本章中的重新安装文件系统配方,因为此配方需要对存储系统进行写访问。

怎么做。。。

按照以下步骤学习如何创建目录:

  1. 在 REPL 中运行以下代码行:
>>> import os
>>> os.mkdir('mydir')
  1. 现在已经创建了一个名为mydir的目录。运行以下代码块时,将引发异常,因为目录已存在:
>>> os.mkdir('mydir')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 17] File exists
>>> 
  1. 下面的代码块将定义一个返回TrueFalse的函数,具体取决于路径是否存在:
>>> def exists(path):
...     try:
...         os.stat(path)
...     except OSError:
...         return False
...     return True
...     
...     
... 
>>> 
  1. 以下代码块将在两个不同的路径上调用exists函数,以验证其是否正常工作:
>>> exists('main.py')
True
>>> exists('invalid_path')
False
  1. 我们现在可以定义一个名为mkdir_safe的函数,它只会在目录不存在时生成目录:
>>> def mkdir_safe(path):
...     if not exists(path):
...         os.mkdir(path)
...         
...         
... 
>>> 
  1. 以下代码块将在同一路径上多次调用mkdir_safe函数,不会引发异常:
>>> mkdir_safe('newdir')
>>> mkdir_safe('newdir')
  1. 现在我们将定义一个递归创建目录的函数:
>>> def makedirs(path):
...     items = path.strip('/').split('/')
...     count = len(items)
...     paths = ['/' + '/'.join(items[0:i + 1]) for i in 
...     range(count)]
...     for path in paths:
...         os.mkdir(path)
...         
...         
... 
>>> 
  1. 运行以下代码块:
>>> makedirs('/top/middle/bottom')

前面的代码块在执行时,将按照从上到下的正确顺序创建三个目录。

它是如何工作的。。。

在这个配方中,定义并使用了三种不同的功能,每种功能都执行特定的功能。exists函数检查路径是否存在并返回TrueFalse。此检查试图调用路径上的stat函数,并捕获可能引发的任何OSError。如果路径存在,则不会引发此异常,并返回一个True值;否则,返回一个False值。

下一个函数mkdir_safe只是检查路径是否存在,并且只在不存在的路径上调用mkdir函数。最后,定义了makedirs函数,该函数接收具有多个级别的路径。将路径拆分为单独的部分,然后将要创建的路径列表以正确的顺序保存在列表中,从最高路径到最低路径。每个路径都是通过调用mkdir函数来循环和创建的。

还有更多。。。

该配方介绍了三种通用功能,每种功能都有特定的用途。通过以这种方式创建代码片段,可以更轻松地获取一个项目的片段并将其合并到其他项目中。定义的函数中有两个-existsmakedirs是 Python 标准库的一部分,但在 MicroPython 中找不到。这个方法表明,在许多情况下,即使在 Python 标准库中有一些您遗漏的函数,您也可以经常在 MicroPython 中创建自己的实现。

另见

以下是有关此配方的一些参考资料:

读取文件内容

此配方将向您展示如何将文件内容读入脚本中的变量。本食谱将介绍以字符串形式读入文件内容以及以字节对象形式读入文件内容的方法。您创建的许多项目通常需要打开不同的数据文件,例如音频文件、图像和文本文件。此配方将为您提供基本的构建块,以便您能够促进这些交互。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。

怎么做。。。

按照以下步骤学习如何读取文件内容:

  1. 在根路径中创建一个名为hi.txt的文件,包含以下内容:
hi there
  1. 在 REPL 中执行以下代码块:
>>> f = open('hi.txt')
>>> data = f.read()
>>> f.close()
>>> data
'hi there\n'
  1. 名为hi.txt的文件内容被读入名为data的变量,然后显示为输出。下面的代码块也将文件内容读入变量,但使用了with语句:
>>> with open('hi.txt') as f:
...     data = f.read()
...     
... 
>>> data
'hi there\n'
  1. 可以使用一行代码将文件内容读入变量,如下例所示:
>>> data = open('hi.txt').read()
>>> data
'hi there\n'
  1. 执行以下代码块:
>>> data = open('hi.txt', 'rb').read()
>>> data
b'hi there\n'
>>> type(data)
<class 'bytes'>

前面的代码块在执行时将以bytes对象而不是字符串的形式读取文件内容。

它是如何工作的。。。

在这个配方中,我们探索了从文件中读取数据的四种不同方式。第一种方法使用open函数获取文件对象。然后,从该文件对象读取数据并关闭。然后,我们可以使用with语句改进这种旧的文件处理方式,如第二个示例所示,一旦退出with块,它将自动关闭文件。第三个示例在一行中打开并读取所有内容。open函数接受文件模式,因为它是第二个参数。如果我们将rb值传递给它,它将以二进制模式打开文件进行读取。这将导致返回字节对象,而不是字符串。

还有更多。。。

您需要选择正确的读取文件数据的方法,这取决于您希望与之交互的数据。如果您的数据文件是纯文本文件,那么默认的文本模式就足够了。但是,如果您正在以.wav文件格式读取原始音频数据,您需要这样做才能将数据作为二进制数据读入,可能会出现异常,因为数据可能无法解码为字符串。

另见

以下是有关此配方的一些参考资料:

写入文件内容

此配方将向您展示如何将数据写入输出文件。我们将介绍如何将字符串和字节写入文件。然后,我们将定义一种对象类型,以便更容易地执行这些将文本和二进制数据写入文件的常见操作。如果您想要创建一个项目,将传感器数据保存到日志文件中,或者将一些用户生成的数据记录到电路板的存储器中,那么您需要使用我们将在本配方中介绍的许多技术。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。确保您已完成本章中的重新安装文件系统配方,因为此配方需要对存储系统进行写访问。

怎么做。。。

按照以下步骤学习如何编写文件内容:

  1. 使用 REPL 运行以下代码行:
>>> with open('hi.txt', 'w') as f:
...     count = f.write('hi there')
...     
...     
... 
>>> count
8
  1. 读取的文本hi there已使用文件对象的write方法写入名为hi.txt的文件。然后返回并显示写入的字节数。下面的代码块将获取一个 bytes 对象并将其交给write方法,以便它可以将数据写入提供的文件:
>>> with open('hi.txt', 'wb') as f:
...     count = f.write(b'hi there')
...     
...     
... 
>>> count
8
>>>
  1. 下面的代码块将用两个方法定义一个Path类。一种方法将初始化新对象,而另一种方法将生成对象的表示:
>>> class Path:
...     def __init__(self, path):
...         self._path = path
...         
...     def __repr__(self):
...         return "Path(%r)" % self._path
...         
... 
>>> 
>>> path = Path('hi.txt')
>>> path
Path('hi.txt')
>>> 
  1. 在执行以下块之后,我们将有一个Path类,其中包含两个附加方法,以便我们可以将文本和二进制数据写入文件:
>>> class Path:
...     def __init__(self, path):
...         self._path = path
...         
...     def __repr__(self):
...         return "Path(%r)" % self._path
...         
...     def write_bytes(self, data):
...         with open(self._path, 'wb') as f:
...             return f.write(data)
...             
...     def write_text(self, data):
...         with open(self._path, 'w') as f:
...             return f.write(data)
...             
... 
>>> 
>>> path = Path('hi.txt')
>>> path.write_text('hi there')
8
>>> path.write_bytes(b'hi there')
8
  1. 将以下代码块保存到名为pathlib.py的文件中,以便导入:
class Path:
    def __init__(self, path):
        self._path = path

    def __repr__(self):
        return "Path(%r)" % self._path

    def write_bytes(self, data):
        with open(self._path, 'wb') as f:
            return f.write(data)

    def write_text(self, data):
        with open(self._path, 'w') as f:
            return f.write(data)
  1. 以下代码应放入main.py文件中:
from pathlib import Path

Path('hi.txt').write_text('hi there')

当执行此脚本时,它会将文本hi there消息写入hi.txt文件。

它是如何工作的。。。

在这个配方中,我们首先展示了将字节和文本数据写入文件的两种最简单的方法。然后,我们创建了一个名为Path的类,我们分两个阶段构建它。第一个版本允许我们创建Path对象,跟踪它们的路径,并在请求时返回人类可读的表示。

然后,我们添加了助手方法来帮助编写文本数据或二进制数据。该类及其方法的名称与标准库附带的 Pythonpathlib模块中的Path对象具有相同的命名和功能。最后一个代码块显示了一个导入pathlib模块并调用其write_text方法将一些文本保存到文件的简单示例。

还有更多。。。

在某些项目中,您可能会遇到这样的情况:必须与文件及其路径交互,并且必须频繁地写入和读取数据。在这些情况下,配备一个类来简化对文件的访问非常有帮助。在此配方中定义的Path对象非常适合此用途。我们还遵循了作为 Python 标准库一部分的模块的相同命名和功能。当我们希望在安装了完整 Python 的计算机上运行代码时,这将使代码更具可读性和可移植性。

另见

以下是有关此配方的一些参考资料:

计算磁盘使用率

此配方将向您展示如何检查与存储系统相关的大量数据。我们将检索文件系统的块大小、块的总数和可用块的数量。然后,我们可以使用这些数字来计算一些有用的数字,例如总磁盘容量以及磁盘上已使用和可用的空间。

然后,我们将所有这些代码打包成一个函数,以便在需要访问这些信息时更容易调用。您可以使用此配方中显示的技术在项目中实现许多事情。例如,您可以使用它来确定设备上的总可用存储量,因为这在不同的板之间是不同的。您甚至可以使用它来决定磁盘是否已满,以及脚本是否应该删除一些旧的日志文件。

准备

要运行此配方中提供的代码,您需要访问电路操场 Express 上的 REPL。

怎么做。。。

按照以下步骤学习如何计算磁盘使用率:

  1. 在 REPL 中运行以下代码行:
>>> import os
>>> stats = os.statvfs('/')
>>> stats
(1024, 1024, 2024, 1040, 1040, 0, 0, 0, 0, 255)
  1. 我们现在已经检索了所有关键的文件系统信息,但它是以元组的形式呈现的,这使得我们很难知道哪个数字与什么有关。在下面的代码块中,我们将把我们关心的值分配给更易于阅读的变量名:
>>> block_size = stats[0]
>>> total_blocks = stats[2]
>>> free_blocks = stats[3]
  1. 现在我们在人类可读变量中有了这些关键信息,我们可以继续下面的代码块来计算我们感兴趣的主要值:
>>> stats = dict()
>>> stats['free'] = block_size * free_blocks
>>> stats['total'] = block_size * total_blocks
>>> stats['used'] = stats['total'] - stats['free']
>>> stats
{'free': 1064960, 'used': 1007616, 'total': 2072576}
  1. 以下代码块将把所有这些逻辑包装成一个函数:
>>> def get_disk_stats():
...     stats = os.statvfs('/')
...     block_size = stats[0]
...     total_blocks = stats[2]
...     free_blocks = stats[3]
...     stats = dict()
...     stats['free'] = block_size * free_blocks
...     stats['total'] = block_size * total_blocks
...     stats['used'] = stats['total'] - stats['free']
...     return stats
... 
>>> 
>>> get_disk_stats()
{'free': 1064960, 'used': 1007616, 'total': 2072576}
>>> 
  1. 以下函数将以更易于理解的方式格式化以字节表示的值:
>>> def format_size(val):
...     val = int(val / 1024)               # convert bytes to KiB
...     val = '{:,}'.format(val)            # add thousand separator
...     val = '{0: >6} KiB'.format(val)     # right align amounts
...     return val
...     
...     
... 
>>> print('total space:', format_size(stats['total']))
total space:  2,024 KiB
>>> 
  1. 现在,我们可以创建一个函数,用于打印与磁盘总大小和使用率相关的一些关键数字:
>>> def print_stats():
...     stats = get_disk_stats()
...     print('free space: ', format_size(stats['free']))
...     print('used space: ', format_size(stats['used']))
...     print('total space:', format_size(stats['total']))
...     
...     
... 
>>> print_stats()
free space:   1,040 KiB
used space:     984 KiB
total space:  2,024 KiB
>>>
  1. 以下代码应放入main.py文件中:
import os

def get_disk_stats():
    stats = os.statvfs('/')
    block_size = stats[0]
    total_blocks = stats[2]
    free_blocks = stats[3]
    stats = dict()
    stats['free'] = block_size * free_blocks
    stats['total'] = block_size * total_blocks
    stats['used'] = stats['total'] - stats['free']
    return stats

def format_size(val):
    val = int(val / 1024)               # convert bytes to KiB
    val = '{:,}'.format(val)            # add thousand separator
    val = '{0: >6} KiB'.format(val)     # right align amounts
    return val

def print_stats():
    stats = get_disk_stats()
    print('free space: ', format_size(stats['free']))
    print('used space: ', format_size(stats['used']))
    print('total space:', format_size(stats['total']))

print_stats()

执行此脚本时,它将打印可用、已用和总磁盘空间的详细信息。

它是如何工作的。。。

statvfs函数返回与板上文件系统相关的一些关键数字。我们关心这个元组中的三个值,它们映射到block_sizetotal_blocksfree_blocks变量。我们可以将这些值相乘,以字节为单位计算可用、已用和总磁盘空间量。然后,定义format_size函数将字节值转换为KiB,添加 1000 个分隔符,并右对齐值。print_stats函数通过获取文件系统的stats并对每个值调用format_size函数,简单地组合了所有这些代码。

还有更多。。。

Circuit Playway Express 附带 2MB 闪存,可以在本配方的输出中看到。MicroPython 使用 FAT 格式作为其文件系统。您可以尝试的一件事是在电路板上添加一些文件,然后重新运行脚本以查看文件系统使用情况的变化。请记住,要想看到这些变化反映在许多板上,您必须弹出 USB 设备并将其插回以获取最新的文件系统使用数据。

另见

以下是有关此配方的一些参考资料: