文件
计算机按二进制格式存储信息,二进制只使用 1 和 0。每个 1 或 0 称为一位(bit),8 位一组称为一个字节(byte)。文件是有名字的字节集合,存储在硬盘、CD、DVD、软盘、flash 盘或其他存储介质上。
文件可以存储很多不同类型的信息。一个文件可以包含文本、图片、音乐、计算机程序、电话号码表等内容。计算机硬盘上的所有内容都以文件的形式存储。程序就是由一个或多个文件构成的。
文件有以下属性:
- 名字
- 类型,表明文件中包含什么类型的数据(图片、音乐、文本)
- 位置(文件存储在哪里)
- 大小(文件中有多少字节)
文件名
文件名中有一部分用来指示文件中包含什么类型的数据。文件名中通常至少有一个点(.),点后面的部分指出了文件的类型。这一部分称为扩展名(extension)。
文件位置
每个文件都要存储在某个地方,所以除了文件名外,每个文件还有自己的位置。硬盘和其他存储介质都组织为文件夹或目录。文件夹(folder)和目录(directorie)表示的是同一样东西,只是名字不同而已。它们是一种组织文件的方法。文件夹或目录组织和关联的方式称为文件夹结构或目录结构。
文件夹中还可以有其他文件夹,这些文件夹本身又可以包含另外的文件夹,依此类推。
打开文件
打开文件之前,需要知道你要对文件做些什么:
- 如果你要使用这个文件作为输人(只查看文件中有什么,而不做任何改变),就是要打开文件完成读;
- 如果要创建一个全新的文件或者用某个全新的文件替换现有的文件,就是要打开文件完成写;
- 如果要为一个现有文件增加内容,就是要打开文件完成追加。
#access_mode 可以是 'r', 'w', 'a', '+', 'b' 等
handle = open(file_name, access_mode)
do_something(handle)
handle.close()
读文件
如果想打开一个文件完成读,但是这个文件根本不存在,你就会得到一条错误消息。
with open(file_name, access_mode) as f:
do_something(f)
逐行读取
readlines()方法会读取文件的所有行,直到文件末尾。如果你想一次只读取一行,可以使用readline()方法,如下:
first_line = my_file.readline()
这只会读文件的第一行。如果再在同一个程序中使用 readline()
,Python 会记住目前在什么位置。所以,第二次使用时,你会得到文件的第二行。
文本文件
文件能够存储任何内容,文本只是其中的一种。程序员把所有其他类型的文件都统称为二进制文件(binary file)。可以打开的文件主要有以下两种类型:
- 文本文件:这些文件包含了文本,包括字母、数字、标点符号和一些特殊字符,如换行符。
- 二进制文件:这些文件不包含文本,它们可能包含音乐、图片或其他类型的数据。不过由于不包含文本,所以这些文件中也没有行,因为根本不存在换行符。
二进制文件
不能对二进制文件使用 readline()
或 readlines()
。例如,如果想要从一个 .wav
文件读取一“行”,你根本无法知道会得到些什么。大多数情况下,你可能会得出一大堆奇怪的东西。
.wav
文件最前面有一些东西看起来像是文本,不过后面就很莫名其妙了。这是因为 .wav
文件不包含文本,只包含声音。readline()
和 readlines()
方法只能用于读取文本文件。
写文件
如果你想更持久地存储程序的信息,比较好的做法是把信息保存在硬盘上,这样一来,即使程序不再运行(即计算机已经关机),你的数据仍然能保留下来,供以后使用。
在文件中添加内容有两种方法。
- 写:这表示开始新文件,或者覆盖现有的文件。
- 追加:这表示增加到现有的文件,保留原来已有的内容。
pickle
如果你想存储列表或对象实例之类的内容呢?可以把所有对象的属性都转换为字符串,再写到一个文本文件中,但是之后你还得把这个过程反过来,从文件恢复对象。这就复杂化了。
Python 提供了一种更简便的方法来存储列表和对象。这是一个 Python 模块,名为 pickle
。