保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。

10.2.1 写入空文件

要将文本写入文件,你在调用open()时需要提供另一个实参,告诉Python你要写入打开的文件。为明白其中的工作原理,我们来将一条简单的消息存储到文件中,而不是将其打印到屏幕上:

  1. # write_message.py
  2. message = "Ich liebe Six!"
  3. with open('message.txt', 'w') as f:
  4. f.write(message)

在这个示例中,调用open()时提供了两个实参。第一个实参也是要打开的文件的名称;第二个实参(’w’)告诉Python,我们要以写入模式打开这个文件。打开文件时,可指定读取模式(’r’)、写入模式(’w’)、附加模式(’a’)或让你能够读取和写入文件的模式(’r+’)。如果你省略了模式实参,Python将以默认的只读模式打开文件。

如果你要写入的文件不存在,函数open()将自动创建它。然而,以写入(’w’)模式打开文件时千万要小心,因为如果指定的文件已经存在,Python将在返回文件对象前清空该文件。

在第四行处,我们使用文件对象的方法write()将一个字符串写入文件。这个程序没有终端输出,但如果你打开文件message.txt,将看到其中包含如下一行内容:


Ich liebe Six!


相比于你的计算机中的其他文件,这个文件没有什么不同。你可以打开它、在其中输入新文本、复制其内容、将内容粘贴到其中等。

10.2.2 写入多行

函数write()不会在你写入的文本末尾添加换行符,因此如果你写入多行时没有指定换行符,文件看起来可能不是你希望的那样:

  1. # write_message.py
  2. message = "Ich liebe Six!"
  3. with open('message.txt', 'w') as f:
  4. f.write(message)
  5. f.write(message)

如果你打开message.txt,将发现两行内容挤在一起:


Ich liebe Six!Ich liebe Six!


要让每个字符串都单独占一行,需要在输出的字符串中包含换行符:

  1. # write_message.py
  2. message = "Ich liebe Six!\n"
  3. with open('message.txt', 'w') as f:
  4. f.write(message)
  5. f.write(message)

现在,输出出现在不同行中:


Ich liebe Six!
Ich liebe Six!


像显示到终端的输出一样,还可以使用空格、制表符和空行来设置这些输出的格式。

10.2.3 附加到文件

如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。

下面来修改write_message.py,在既有文件message.txt中再添加一些喜欢Six的原因:

  1. filename = 'message.txt'
  2. with open(filename, 'a') as f:
  3. f.write('Ich liebe Six, weil sie sehr süß ist!')

然后我们打开message.txt,可以看到之前的内容没有被清空,而是在文件末尾添加了一句话:


Ich liebe Six!
Ich liebe Six!
Ich liebe Six, weil sie sehr süß ist!