2. 储存

有时你需要存储有用的信息。这些信息存储为数据:信息的表示(当存储在计算机上时以数字形式)。 如果您将数据存储在计算机上,即使您关闭再打开设备,它也应该保留。

microPython位允许您使用非常简单的文件系统来完成此操作。

什么是文件系统?

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

../../_images/files.jpg

计算机文件是存储在文件系统上的命名数字资源。这些资源包含有用的信息作为数据。 这正是纸质文件的工作原理。它是一种包含有用信息的命名容器。通常,纸质和数字文件都会被命名以指示它们包含的内容。 在计算机上,通常使用 .xxx 后缀结束文件。通常,表示使用什么类型的数据来表示信息。 例如, .txt 表示文本文件, `` .jpg`` JPEG图像和 .mp3 编码为MP3的声音数据。

某些文件系统(例如笔记本电脑或PC上的文件系统)允许您将文件组织到目录中:命名容器将相关文件和子目录组合在一起。 但是,MicroPython提供的文件系统是一个平面文件系统。平面文件系统没有目录 - 所有文件都只存储在同一个地方。

Python编程语言包含易于使用且功能强大的方式来使用计算机的文件系统。mPython上的MicroPython实现了这些功能的有用子集 ,使其易于在设备上读取和写入文件,同时还提供与其他Python版本的一致性。

2.1. 打开文件

以下为Python File操作的相关操作说明。

open()方法:

#open(路径+文件名,读写模式) ,如 f=open('/tmp/hello','w')
#读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件。如:'rb','wb','r+b'等等
读写模式的类型有:
rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
w     以写方式打开,
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+     以读写模式打开
w+     以读写模式打开 (参见 w )
a+     以读写模式打开 (参见 a )
rb     以二进制读模式打开
wb     以二进制写模式打开 (参见 w )
ab     以二进制追加模式打开 (参见 a )
rb+    以二进制读写模式打开 (参见 r+ )
wb+    以二进制读写模式打开 (参见 w+ )
ab+    以二进制读写模式打开 (参见 a+ )

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

file.read([size]) #size未指定则返回整个文件,如果文件大小>2倍内存则有问题.f.read()读到文件尾时返回""(空字串)
file.readline() #返回一行
file.readline([size]) #返回包含size行的列表,size 未指定则返回全部行
for line in f: print line #通过迭代器访问
file.write("hello\n") #如果要写入字符串以外的数据,先将他转换为字符串.
file.tell() #返回一个整数,表示当前文件指针的位置(就是到文件头的字节数)。
file.seek(偏移量,[起始位置])  #用来移动文件指针,偏移量:单位:字节,可正可负,起始位置:0-文件头,默认值;1-当前位置;2-文件尾。
file.close() #关闭文件

有关更多的open()使用,可查阅 CPython 文档:open()


通过该 open 功能实现在文件系统上读取和写入文件。打开文件后,您可以使用它直到关闭它(类似于我们使用纸质文件的方式)。

确保这一点的最好方法是使用如下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:
    # 在这段代码块中完成文件的读写

# 当块完成时,然后使用MicroPython
# 自动为您关闭文件。

就像纸质文件一样,打开文件有两个原因:读取其内容(如上所示)或向文件写入内容。 默认模式是读取文件。如果要写入文件,则需要 open 按以下方式告诉函数:

with open('hello.txt', 'w') as my_file:
    my_file.write("Hello, World!")

请注意,该 'w' 参数用于将 my_file 对象设置为写入模式。 您还可以传递一个 'r' 参数来将文件对象设置为读取模式,但由于这是默认设置,因此通常会将其保留。

将数据写入文件是通过(您猜对了) write 方法完成的,该方法将您要写入文件的字符串作为参数。 在上面的示例中,我将文本“Hello,World!”写入名为“hello.txt”的文件中。

注解

  • 当您打开文件并写入时(可能在文件处于打开状态时多次),如果文件已经存在,您将编写文件内容。
  • 如果要将数据附加到文件,则应首先将其读取,将内容存储在某处,关闭它,将数据附加到内容中,然后打开它以使用修改后的内容再次写入。

2.2. OS

除了读写文件外,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')

os常用的方法:

os.chdir(path)          #修改路径
os.getcwd()             #获取当前路径
os.listdir(dir)         #目录列表
os.mkdir(dir)           #创建目录
os.remove(path)         #删除文件
os.rmdir(dir)           #删除目录
os.rename(old_path, new_path)   #文件改名
os.stat(path)           #文件/目录状态,具体解释如下:

有关更多的os模块使用,可查阅 os 模块章节。

2.3. 主程序 main.py

boot.py和main.py,这两个文件在启动时由MicroPython专门处理。 首先执行boot.py脚本(如果存在),然后在完成后执行main.py脚本。

此外,如果您将其他Python文件复制到文件系统上,那么 import就像其他任何Python模块一样。 例如,如果您有一个 hello.py 包含以下简单代码的文件:

def say_hello(name="World"):
    return "Hello, {}!".format(name)

你可以导入并使用这样的 say_hello 函数:

from mpython import *
from hello import say_hello

oled.DispChar(say_hello(),0,0)
oled.show()

注解

如果除了MicroPython运行时之外还在设备上刷过了一个脚本,那么MicroPython将忽略main.py并运行您的嵌入式脚本。

要仅刷新MicroPython运行时,只需确保您在编辑器中编写的脚本中包含零个字符。一旦闪存,您就可以复制main.py文件。