目录
- 一、从文件中读取数据
- 1.1 读取整个文件
- 1.2 逐行读取
- 二、写入文件
- 2.1 写入空文件
- 2.2 写入多行
- 2.3 附加到文件
遇到看不明白的地方,欢迎在评论中留言呐,一起讨论,一起进步!
本文参考:《Python编程:从入门到实践(第2版)》
一、从文件中读取数据
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,我们可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。
1.1 读取整个文件
首先我们准备一个文本文件 pi_digits.txt
下面打开并读取这个文件,再将其内容显示到屏幕上:
with open('pi_digits.txt') as file_object:contents = file_object.read()
print(contents)
“这个形式没见过呀 /(ㄒoㄒ)/~~”。别着急,我们逐个分解。
-
函数 open()
我们要记住,无论以任何方式使用文件,哪怕仅仅是打印其内容,都得先 打开文件,才能访问它!
函数 open() 接受一个参数:要打开的文件的名称(如上面的 pi_digits.txt,文件路径的内容可以参考博客:一篇文章搞懂Python的文件路径操作)
函数 open() 返回一个表示文件的对象,Python 将该对象赋给 as 之后的变量供以后使用(如上面的file_object
) -
关键字 with
我们要记住,打开了文件用过之后需要关闭!
虽然 open() 和 open() 搭配使用也可以,但是并非在任何情况下都能轻松确定关闭文件的恰当时机。而关键字 with 让我们只管打开文件,并在需要时使用它,Python 自会在合适的时候自动将其关闭。 -
文件对象.read()
有了表示文件对象后,使用方法 read() 来读取这个文件的全部内容,并将其作为一个长长的字符串进行返回。(上面用contents
来接受这个返回值,这样,通过打印contents
的值,就可将这个文本文件的全部内容显示出来)
1.2 逐行读取
要以每次一行的方式检查文件,可对文件对象使用 for 循环:
filename = 'pi_digits.txt'with open(filename) as file_object:for line in file_object:print(line.rstrip())
其中 rstrip()
来消除每一行每行末尾的换行符
使用关键字 with 时,open() 返回的文件对象只在 with 代码块内可用。 这就是为什么上面代码中要缩进。
如果非要在 with代码块外访问的话,可以先在 with 代码块内将文件的各行存储在一个列表中,并在 with 代码块外使用该列表。
下面的示例在 with 代码块中将文件 pi_digits.txt
的各行存储在一个列表中,再在 with 代码块外打印:
filename = 'pi_digits.txt'with open(filename) as file_object:lines = file_object.readlines()print(lines)
for line in lines:print(line.rstrip())
其中,readlines() 从文件中读取每一行,并将其存储在一个列表中。(注意和 1.1 中的 read() 区分)
二、写入文件
2.1 写入空文件
现在我们没有文件,执行下面这段代码:
filename = 'programming.txt'
with open(filename,'w') as file_object:file_object.write("I love programming.")
我们会发现目录中多了文件 programming.txt
我们在调用 open() 时需要提供两个实参,分别告诉 Python 要文件名和写的动作 'w'
。
打开文件时,可指定读取模式(
'r'
)、写入模式('w'
)、附加模式('a'
)或读写模式('r+'
)。
如果省略了模式实参,Python 将以默认的只读模式打开文件。
如果要写入的文件不存在,函数 open() 将自动创建它。
然而,以写入模式('w'
)打开文件时千万要小心,因为如果指定的文件已经存在,Python 将在返回文件对象前清空该文件的内容。
注意:Python 只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数 str() 将其转换为字符串格式。
2.2 写入多行
我们执行下面这段代码:
filename = 'programming.txt'with open(filename,'w') as file_object:file_object.write("I love programming.")file_object.write("I love creating new games.")
运行结果为:
并没有按照我们所期望的进行分行,这是因为函数 write() 不会在写入的文本末尾添加换行符。
要让每个字符串都单独占一行,需要在方法调用 write() 中包含换行符('\n'
):
filename = 'programming.txt'with open(filename,'w') as file_object:file_object.write("I love programming.\n")file_object.write("I love creating new games.\n")
这样执行结果为:
2.3 附加到文件
如果要给文件添加内容,而不是覆盖原有的内容,可以以附加模式('a'
)打开文件。以附加模式打开文件时。如果指定的文件不存在,Python 将创建一个空文件。
下面来修改代码,在既有文件 programming.txt
中再添加一些内容:
filename = 'programming.txt'with open(filename,'a') as file_object:file_object.write("I also love finding meaning in large datasets.\n")file_object.write("I love creating apps that can run in a browser.\n")
执行结果如下:
确实多了两行内容!