要以任何方式使用文件,哪怕只是打印文件中的内容,也需要先打开文件。保存数据的最简单的方式之一是将其写入到文件中,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。下面介绍python对文件的操作.

读取文件

读取整个文件

在文件pi_digits.txt中,包含精确到小数点后30位的圆周率值,且在小数点后每10位处都换行:

pi_digits.txt

  1. 3.1415926535
  2. 8979323846
  3. 2643383279

下面的程序打开并读取pi_digits.txt的文件内容,并将内容输出在控制台:

  1. with open('pi_digits.txt') as pi_object:
  2. contents = pi_object.read()
  3. print(contents)

上面的程序中,open()接收一个参数,即要打开的文件名,并返回一个表示文件的对象,存储在变量pi中。注意到程序中使用了open(),但没有使用close(),with的使用会使python在合适的时候自动将文件关闭,你只管打开文件,并在需要时使用它。也可以使用open 、close关闭文件,但如果close前出现了异常,文件将无法关闭,导致数据丢失或损坏,这时就需要使用异常捕获,在finally中进行close操作。

逐行读取

读取文件时,常常需要对每行的数据进行检查,例如有一个包含天气数据的文件,文件中每行描述了一天的天气,我们需要找到天气是sunny的日期,就需要对文件一行一行的读取。

要以每次一行的方式读取文件,就需要使用for循环,还是以读取pi_digits.txt文件为例:

  1. with open('pi_digits.txt') as pi_object:
  2. for line in pi_object:
  3. # print默认会进行换行处理,而文本中的换行,也会被当作文件内容读取,如果不对print结尾做处理,打印出的结果每行之间都会有空行
  4. print(line, end='')
  5. # 也可以使用rstrip()过滤空行
  6. # print(line.rstrip())

读取全部文件放入列表

使用with关键字时,open()返回的对象只能在with中使用,要在with代码块的外部使用文件内容,可以使用readlines()将文件每行的内容存放在列表中。

  1. with open('pi_digits.txt') as pi_object:
  2. lines = pi_object.readlines() # 将文件每行的内容作为列表的一个元素
  3. for line in lines: # 循环读取列表中的内容
  4. print(line.rstrip())

⚠️:读取文本文件时,Python将其中的所有文本都解读为字符串。如果读取的是数字,并要将其作为数值使用,就必须使用函数int()将其转换为整数,或使用函数float()将其转 换为浮点数。


写入文件

说明:open文件时,可以指定读写模式,python的读写模式有’r’(读)、’w’(写)、’a’(追加)、’r+’(读取和写入),没有指明模式时,默认为只读模式(r)打开。使用w模式时需要小心,如果要写入的文件已存在,在返回文件对象前会先清空文本内容。使用a模式时,会在原有文件内容末尾进行追加,如果文件不存在,则会新建一个文件。

空文件写入

要对文件进行写入,需要在open()中添加写入的文件名称和读写模式参数’w’,告诉Python你要写入打开的文件。

接下来我们将一条简单的消息保存到文件message.txt中:

  1. with open ('message.txt', 'w') as file_object:
  2. file_object.write('I love python.\n')
  3. file_objext.write('And you?\n')

⚠️:

  • 连续写入多行时,write()不会在内容末尾添加换行符,需要在write语句中包含换行符\n
  • 如果再次打开上面的message.txt,并使用w模式写入,原有的内容”I love python.And you?”则会被清除,文件只会保存最新写入的内容

附加到文件

如果不想覆盖原有内容,而是在原有内容后追加信息,使用可以用附加模式(a)打开文件,接着上面message.txt文件进行操作

  1. with open ('message.txt', 'w') as file_object:
  2. file_object.write('Looking forward to your joining!')

到目前为止,message.txt中的文件内容为

  1. I love python.
  2. And you?
  3. Looking forward to your joining