6.4.1 文件的基本概念

外部存储器上的数据是以文件形式进行组织的。一组相关数据存储在一起便构成一个文件(file),每个文件被赋予一个文件名,程序通过文件名来访问文件。文件名通常由主名 和扩展名构成,后者用来描述文件内容,如常见的.txt、.jpg、.doc 等等。当外存上存储了大 量文件时,为便于管理,常将文件分组,构成一个个文件夹(或称目录);如果每个文件夹 中的文件还是很多,则可以继续分组构成子文件夹(子目录),最终形成一个树形层次式目 录结构。

目录路径

为了指定唯一的文件,必须提供详细的路径。事实上,一个完整的文件标识由磁盘驱动 器、目录层次和文件名三部分构成。各部分之间用特定字符进行分隔,分隔字符在不同操作系统中可能是不同的,例如 Windows 使用“\”,而 Unix、Linux 使用“/”。在 Python 程序 中,路径分隔字符既可以使用“\”,也可以使用“/”。例如,Python 安装目录中有个文件 misc.py,其路径可以用字符串

"C:\Python27\Lib\compiler\misc.py"

来表示。

注意:我们在第 2 章讨论字符串数据时说过,反斜杠字符“\”在 Python 中可作为转义 符,用于表示特殊字符,如"\n"(换行字符)、"\t"(Tab 字符)和"\xc4"(编码为十六进制 c4 的字符)等。文件路径中如果在反斜杠后出现了 n、t、x 等字符,就可能被解释成特殊字符, 从而导致错误。例如,试图用语句

>>> f = open("C:\Python27\Lib\compiler\transformer.py")

打开文件 transformer.py 时,Python 会将字符串中的\t 解释为 Tab 字符,从而报错。避免这 种错误的简单方法是使用正斜杠字符“/”或者使用两个反斜杠“\”表示单个反斜杠,即形 如

"C:/Python27/Lib/compiler/transformer.py" "C:\\Python27\\Lib\\compiler\\transformer.py"

如果文件和程序在同一个文件夹中,则程序中可以省略文件路径,直接使用文件名来标识文件。

文件格式

文件中存储的数据可以有不同的格式。最简单的文件是文本文件,其中存储的数据是无 格式的字符串,因此对文本文件的处理可以逐字符(字节)地进行。另一种文件格式是二进 制文件,其中存储的数据是二进制串,这种二进制串当然不能按一个字节对应一个字符的方 式来解释,例如存储图像、音频信息的.jpg、.mp3 文件就是常见的二进制文件。至于.doc、.xls 和.ppt 等格式的文件各自具有独特的文件结构,也可以归入二进制文件类别,只能用专门的 程序来处理。

在信息管理应用中,大量信息的组织通常都采用“字段-记录-文件”的层次格式。字 段是最基本的不可分割的数据项,如学号、姓名、年龄等;记录是若干个相关字段结合在一 起形成的数据,例如将某个学生的基本信息组合起来就构成形如(5120309001,张三,18) 的记录;大量同类型的记录即构成了文件,例如全体学生记录存储在磁盘上即构成一个学生 数据文件。所有记录按顺序存储,则文件格式可用图 6.1 表示。

图 6.1 字段-记录-文件

本书只讨论文本文件的处理。文本文件中存储的字符主要是可打印字符,包括字母、数字、标点符号和空格等。但有一些控制字符也是常用的,例如“回车”、“换行”等字符,可 用来将文本内容组织成一行一行的形式。由于控制字符不是可打印字符,在程序中只好用转 义符来来间接地表示,例如回车符表示为"\r",换行符表示为"\n"。