一、实验目的
- 掌握不同文件类型的读写
- 掌握目录遍历的方法
- 掌握json解析器的设计与实现
二、实验内容 - 读取文件内容
- 素数写入文件
- 输出文件目录
- 读写json文件
- 实现json解析器
三、实验环境
在Educoder平台进行实验
四、实验要求
根据每个实训的每个关卡要求完成代码提交和测评
五、 实验步骤
1.读取文件内容
常见的编码,utf-8,ascii,Unicode……
根据题目信息,utf-8为默认的编码,文件测试可以用utf-8为测试进行检测
然后使用对文件管理的操作
打开,读写模式的选择
根据要求进行判断
2.素数写入文件
Open函数给出正确的路径即可以对我们的文件进行操作
最开始先三个文件,进行赋值
然后根据循环进行判断
判断素数
3.输出文件目录
文件目录输出的方式有很多种,我个人认为最简单,方式就是用os.walk
但是这个题目
根据题目信息,然后看到
题目只根据它的规定导入库里的函数
这里用递归的思想
如果是文件夹,那就继续调用自身
然后进行遍历
然后输出
4.读写json文件
Json文件,这是java设计的一种方式
打开测试集里看看book.txt长什么样子
根据json文件的格式,需要你每次输出,书名:XXXX,价钱:xxxx
这样的方式
我们可以先把title提取出来然后,就是先把第一行先读取和去掉
然后对后面三行进行遍历
注意输出的结构是字典,所以会用zip,dict函数
但最后输出是在列表里面
5.实现json解析器
这道题代码,较长,得从开头慢慢看
首先是参数
单看这个肯定是很难懂,但是往往python的官方文档,里面都会在前面加上注释,这也就是代码,写好注释的习惯
此部分定义了一个名为 Enum 的枚举(尽管它被自定义类名覆盖)来表示 JSON 字符串中可以找到的不同类型的令牌。每个令牌类型都有一个相应的整数值
全局变量:
• json_index: 此全局变量用于跟踪正在解析的 JSON 字符串中的当前位置
token_parse 函数:
此函数将 JSON 字符串和当前索引作为输入,并返回包含已解析令牌和新索引的元组。它使用一系列辅助函数来处理不同的令牌类型:
• read_num: 此函数从 JSON 字符串中读取数字并返回类型为 NUMBER_TOKEN 的令牌。
• read_str: 此函数从 JSON 字符串中读取字符串并返回类型为 STRING_TOKEN 的令牌。它处理字符串中的转义双引号。
• read_null: 此函数检查字符串 “null” 并返回类型为 NULL_TOKEN 的令牌。
• read_bool: 此函数检查字符串 “true” 或 “false” 并返回类型为 BOOL_TOKEN 的
tokenizer 函数:
• 此函数将 JSON 字符串作为输入并返回令牌列表。它逐个字符迭代 JSON 字符串,调用 token_parse 函数获取下一个令牌并将其附加到列表中。该过程一直持续到 JSON 字符串结束(由 END_JSON 令牌指示)。
generate_token 函数:
• 此函数将令牌类型和令牌值作为输入,并返回表示令牌的元组。此函数可能由其他函数内部使用来创建令牌。
generate_tokenlist 函数:
此函数将令牌列表和令牌作为输入,并将令牌附加到列表中。此函数可能由其他函数内部使用来构建令牌列表。
parse_json 函数:
此函数将令牌列表作为输入,并将其解析为表示 JSON 对象的 Python 数据结构(字典或列表)。它使用两个辅助函数:
• parse_json_array: 此函数处理解析 JSON 数组。它迭代令牌列表并期望令牌如 BEGIN_ARRAY, END_ARRAY, 逗号和表示数组中值的令牌。它构建一个 Python 列表来表示 JSON 数组。
• parse_json_object: 此函数处理解析 JSON 对象。它迭代令牌列表并期望令牌如 BEGIN_OBJECT, END_OBJECT, 冒号、逗号和表示对象中键和值的令牌。它构建一个 Python 字典来表示 JSON 对象。
main 块:
• 当程序直接运行时,此块是程序的入口点。它提示用户输入,读取原始 JSON 数据,调用 tokenizer 函数获取令牌列表,然后调用 parse_json 函数解析令牌并将它们转换为 Python 数据结构。然后将解析后的数据结构打印到控制台。
六、问题记录和实验总结(必写)
首先,第一个问题,对于文件处理的方式,有几种,在实际中,其实应该选择自己最熟悉,以及最便捷,通俗易懂的方式进行,我个人而言,对于文件路径,更喜欢os.walk,而不是需要自己遍历然后判断,除此之外,对于文件操作,文件的格式往往是不一样的,很多的文件采用的编码方式,肯定是不同的,python处理的文件需要哪一种,需要我们自己取确定好,这样才不容易报错
了解文件格式是很重要的一点,对于json文件,其实他适用于客户端,和服务器之间的便捷,还有很多文件结构,对典型的就是我们现在大部分Windows的PE文件,而其实文件结构的内容,主要关联的部分是操作系统,操作系统对文件的处理方式
JSON 是一种简单、易读、易于解析的格式,非常适合于数据交换和存储简单的数据结构。但是,对于需要存储复杂数据结构或需要类型检查和安全性的应用程序,JSON 可能不是最佳选择
通过这次实验,还是去看了一下json的文件结构
JSON 文件的二进制格式由以下几个部分组成:
• 文件头: 文件头包含有关 JSON 文件的元信息,例如文件格式版本和字符编码。
• 对象: 对象由键值对组成,键和值都以二进制形式存储。
• 数组: 数组是有序的元素列表,元素可以是任何 JSON 数据类型。
• 基本数据类型: 基本数据类型以二进制形式存储,例如字符串以 UTF-8 编码存储,数字以 IEEE 754 浮点数格式存储。
• 空值: 空值以特殊字节表示
JSON 文件与 PE 文件和 ELF 文件的对比
JSON、PE 和 ELF 都是文件格式,但它们用于不同的目的:
- JSON: JSON 是一种轻量级的数据交换格式,易于阅读和解析,常用于 Web 开发、数据存储和配置文件等领域。
- PE: PE 是 Windows 操作系统可执行文件的格式,用于存储程序代码和资源。
- ELF: ELF 是 Linux 和其他 Unix 操作系统可执行文件的格式,用于存储程序代码和资源。
以下是 JSON、PE 和 ELF 文件的详细对比:
特性 | JSON | PE | ELF |
---|---|---|---|
用途 | 数据交换 | 可执行文件 | 可执行文件 |
格式 | 文本 | 二进制 | 二进制 |
可读性 | 易于阅读 | 难以阅读 | 难以阅读 |
可解析性 | 易于解析 | 难以解析 | 难以解析 |
支持的平台 | 跨平台 | Windows | Linux 和 Unix |
安全性 | 无内置安全机制 | 支持安全机制 | 支持安全机制 |
复杂性 | 简单 | 复杂 | 复杂 |
JSON 与 PE/ELF 文件的比较:
- JSON 是文本格式,易于阅读和解析,但 PE/ELF 是二进制格式,难以阅读和解析。
- JSON 适用于数据交换,PE/ELF 适用于存储程序代码和资源。
- JSON 不支持安全性,PE/ELF 支持安全机制。
- JSON 比较简单,PE/ELF 比较复杂。
总结:
JSON、PE 和 ELF 文件都是重要的文件格式,但它们用于不同的目的。选择哪种文件格式取决于您的具体需求。
以下是一些与 JSON、PE 和 ELF 文件相关的其他问题:
- 如何使用 JSON 解析库解析 JSON 文件?
- 如何使用 PE/ELF 解析器解析 PE/ELF 文件?
- 如何使用 JSON 生成器生成 JSON 文件?
- 如何使用 PE/ELF 编辑器编辑 PE/ELF 文件?
如果您还有其他问题,请随时问我。
参考资料:
- JSON 官方网站: https://json.org/
- PE 文件格式: https://en.wikipedia.org/wiki/Portable_Executable
- ELF 文件格式: https://en.wikipedia.org/wiki/Executable_and_Linkable_Format