《Python 3程序开发指南(第2版•修订版)》——7.6 练习

7.6 练习

第一个练习是创建一个比本章展示的更简单的二进制记录文件模块——其记录大小与用户指定的恰好一样。第二个练习是使用新的二进制记录文件模块对BikeStock模块进行修改。第三个练习要求从头开始创建一个程序——其中的文件处理部分是非常直截了当的,但某些输出格式有一定难度。

1.创建一个新的、更简单的BinaryRecordFile模块版本——其中不使用状态字节。对这一版本而言,用户指定的记录大小就是记录的实际大小。如果要添加新记录,就必须使用一个新的append()方法,该方法只是简单地将文件指针移动到文件末尾,并写入待添加的记录。__setitem__()方法应该只允许替换现存的记录,为此,一种简单的方法是使用__seek_to_index()方法。由于不再使用状态字节,因此__getitem__()消减到只有3行代码。__delitem__()方法需要完全重写,因为该方法必须移动所有相关的记录,以便消除文件中存在的差距,这仅需要大概6行代码即可完成,但确实也需要一些设计与衡量。undelete()方法必须移除,因为新实现的模块不支持这种操作,compact()方法与inplace_compact()方法也必须被移除,同样是因为不再需要。

总体而言,与原始版本相比,新版本需要添加或修改不到20行代码,并删除至少60行代码(doctests除外)。BinaryRecordFile_ans.py提供了针对该练习的解决方案。

2.在确定更简单的BinaryRecordFile类可以正常工作后,复制BikeStock.py文件并对其进行修改,使其可以与BinaryRecordFile类共同工作。这只需要修改少数几行代码,BikeStock_ans.py文件提供了相应的解决方案。

3.对二进制格式进行调试可能是比较困难的,但使用工具对二进制文件内容进行转储将有助于分析。创建一个程序,使其有如下的控制台帮助文本:

Usage: xdump.py [options] file1 [file2 [... fileN]]

Options:
   -h, --help             show this help message and exit
   -b BLOCKSIZE, --blocksize=BLOCKSIZE
                        block size (8..80) [default: 16]
   -d, --decimal         decimal block numbers [default: hexadecimal]
   -e ENCODING, --encoding=ENCODING
                         encoding (ASCII..UTF-32) [default: UTF-8]

如果有一个BinaryRecordFile,其中存储记录的格式为“<i10s”(little-endian,4字节有符号整数,10字节字符串),使用这一程序,通过将块大小设置为与记录大小匹配(15字节,包括状态字节),可以获取文件中内容的清晰影像,比如:

xdump.py -b15 test.dat
Block      Bytes                              UTF-8 characters
--------   ---------------------------------  ----------
00000000   02000000 00416C70 68610000 000000  .....Alpha.....
00000001   01140000 00427261 766F0000 000000  .....Bravo.....
00000002   02280000 00436861 726C6965 000000  .(...Charlie...
00000003   023C0000 0044656C 74610000 000000  .<...Delta.....

每个字节都使用一个两个数字表示的十六进制数,其中每组4字节之间(或每组8个十六进制数字之间)的空格的作用只是为了提高可读性。这里,我们可以看到,第二条记录(“Bravo”)已经被删除,因为其状态字节为0x01,而不是用于指示非空白其未删除记录的0x02。

使用optparse模块来处理命令行选项(通过指定某选项的类型,可以使optparse处理字符串到整数的转换)。要使标题对准任意给定的块大小并正确对准最后一块的字符,可能是非常棘手的,因此,要确保对不同块大小进行了测试(比如8、9、10…40)。并且,不要忘记对不同长度的文件,最后一块可能是很短的。如实例中所展示的,可以使用句点来表示不可打印的字符。

该程序可以使用不到70行代码完成,包括两个函数,xdump.py提供了相应的解决方案。

时间: 2024-09-12 00:09:37

《Python 3程序开发指南(第2版•修订版)》——7.6 练习的相关文章

《Python 3程序开发指南(第2版•修订版)》——2.2 Integral类型

2.2 Integral类型 Python提供了两种内置的Integral类型,即int与bool1.整数与布尔型值都是固定的,但由于Python提供了增强的赋值操作符,使得这一约束极少导致实际问题.在布尔表达式中,0与False表示False,其他任意整数与true都表示true.在数字表达式中,True表示1,False表示0.这意味着,有些看起来很怪异的表达式也是有效的.例如,我们可以使用表达式i += True来对整型变量i进行递增操作,当然,最自然的方法还是i+=1. 2.2.1 整数

《Python 3程序开发指南(第2版•修订版)》——第1章 过程型程序设计快速入门 1.1 创建并运行Python程序

第1章 过程型程序设计快速入门 本章提供了足以开始编写Python程序的信息.如果此时尚未安装Python,强烈建议读者先行安装Python,以便随时进行编程实践,获取实际经验,巩固所学的内容. 本章第1节展示了如何创建并执行Python程序.你可以使用自己最喜欢的普通文本编辑器来编写Python代码,但本节中讨论的IDLE程序设计环境提供的不仅是一个代码编辑器,还提供了很多附加的功能,包括一些有助于测试Python代码.调试Python程序的工具. 第2节介绍了Python的8个关键要素,通过

《Python 3程序开发指南(第2版•修订版)》——2.7 练习

2.7 练习 1.修改程序print_unicode.py,以便用户可以在命令行上输入几个单独的单词,并且只有在Unicode字符名包含用户指定的所有单词时才打印相应列.这意味着,我们可以输入类似于如下的命令: print_unicode_ans.py greek symbol 实现上述要求的一种方法是使用words列表替换word变量(其中存放0.None或字符串).改变代码后,要记得更新使用帮助信息.这一改变需要添加不到10行代码,另外需要对不到10行的代码进行适当修改.文件print_un

《Python 3程序开发指南(第2版•修订版)》——2.3 浮点类型

2.3 浮点类型 Python提供了3种浮点值:内置的float与complex类型,以及来自标准库的decimal.Decimal类型,这3种数据类型都是固定的.float类型存放双精度的浮点数,具体取值范围则依赖于构建Python的C(或C#或Java)编译器,由于精度受限,对其进行相等性比较并不可靠.float类型的数值要使用小数点或使用指数表示,比如,0.0.4..5.7.-2.5.-2e9.8.9e-4等. 计算机使用基数2表示浮点数--这意味着,有些十进制数可以准确表示(比如0.5)

《Python 3程序开发指南(第2版•修订版)》——1.2 Python的关键要素

1.2 Python的关键要素 在本节中,我们将学习Python的8个关键要素,下一节中,我们将展示如何借助这些要素编写实际的小程序.关于本节中讲述的各关键要素,都有更多的内容需要阐述,因此,阅读本节的内容时,有时候你会觉得Python似乎遗失了一些内容,使得很多工作只能以一种冗繁的模式完成,如果使用前向索引或索引表格中的内容,那么你几乎总是可以发现Python具备你需要的特性,并且可以更紧凑的表达方式来完成当前展示的工作方式--还有很多其他内容. 1.2.1 要素#1:数据类型 任何程序语言都

《Python 3程序开发指南(第2版•修订版)》——2.4 字符串

2.4 字符串 字符串是使用固定不变的str数据类型表示的,其中存放Unicode字符序列.str数据类型可以作为函数进行调用,用于创建字符串对象--参数为空时返回一个空字符串,参数为非字符串类型时返回该参数的字符串形式,参数为字符串时返回该字符串的拷贝.str()函数也可以用作一个转换函数,此时要求第一个参数为字符串或可以转换为字符串的其他数据类型,其后跟随至多两个可选的字符串参数,其中一个用于指定要使用的编码格式,另一个用于指定如何处理编码错误. 前面我们注意到,字符串是使用引号创建的,可以

《Python 3程序开发指南(第2版•修订版)》——2.5 实例

2.5 实例 在这一节中,我们将根据本章以及前面一章中所学的知识,提供两个虽小但完整的程序,以助于巩固到此为止所学的Python知识.第一个程序有点偏数学化,但是非常小,大约35行代码.第二个程序是关于文本处理的,并且更具体,其中包含7个函数,大约80行代码. 2.5.1 quadratic.py 二次方程是指形如ax2 + bx + c = 0的方程,其中,a不为0描述的是抛物线.这一方程的根可以由公式 得出,其中,公式的b2-4ac部分称为判别式--如果为正值,那么该方程有两个实根:如果为0

《Python 3程序开发指南(第2版•修订版)》——1.5 练习

1.5 练习 在本书的每一章最后,都有一节练习,设置练习的目的是鼓励读者对Python进行实践,获取实际经验,以助于吸收每章中所学的知识.本节包括的实例与练习既涉及数字处理,也涉及文本处理,以便尽可能满足更多读者的需求.此外,这些实例与练习都有非常小的代码规模,以便于读者将重点和注意力集中于学习与思考,而不是仅仅输入代码.本书的实例中,为每个练习都提供了一个解决方案. 1.bigdigits.py程序的一个变形,不再打印*,而是打印具体的数字.例如: bigdigits_ans.py 71942

《Python 3程序开发指南(第2版•修订版)》——导读

前 言 在应用广泛的各种语言中,Python或许是最容易学习和最好使用的.Python代码很容易阅读和编写,并且非常清晰,而没有什么隐秘的.Python是一种表达能力非常强的语言,这意味着,在设计同样的应用程序时,使用Python进行编码所需要的代码量要远少于使用其他语言(比如C++或Java)的代码量. Python是一种跨平台的语言:一般来说,同样的Python程序可以同时在Windows平台与UNIX类平台(比如Linux.BSD与Mac OS X)上运行--只需要将构成Python程序的

《Python 3程序开发指南(第2版•修订版)》——7.3 写入与分析XML文件

7.3 写入与分析XML文件 有些程序将其处理的所有数据都使用XML文件格式,还有些其他程序将XML用作一种便利的导入/导出格式.即便程序的主要格式是文本格式或二进制格式,导入与导出XML的能力也是有用的,并且始终是值得考虑的一项功能. Python提供了3种写入XML文件的方法:手动写入XML:创建元素树并使用其write()方法:创建DOM并使用其write()方法.XML文件的读入与分析则有4种方法:人工读入并分析XML(不建议采用这种方法,这里也没有进行讲述--正确处理某些更晦涩和更高级