文件的使用
在实际的开发使用中,我们不可能每获取一次数据便运行一次程序,这样太显得繁琐,而且其中的数据无法得到有效的利用,这样我们需要将我们的程序运行的某些结果保存到本地,最简单的方式便是保存到文件中
在 Python 中对于文件的操作十分简单,我们只需要使用内置函数open
打开文件之后便可以轻松的实现相应的操作了。
在open
使用中含有以下的参数:
操作模式 | 具体含义 |
---|---|
'r' | 读取 (默认) |
'w' | 写入(会先截断之前的内容) |
'x' | 写入,如果文件已经存在会产生异常 |
'a' | 追加,将内容写入到已有文件的末尾 |
'b' | 二进制模式 |
't' | 文本模式(默认) |
'+' | 更新(既可以读又可以写) |
读取文件
在读取文件的时候,我们需要指定文件的路径名,可以使用绝对路径
,也可以使用相对路径
,并且同时我们需要将文件模式设置为'r'
模式(如果不设置,默认也为'r'
),同时我们可以使用encoding
指定打开文件的编码格式
,如果与文件的编码格式不同,读写出来的文件内容可能乱码
下面假设我们有一个test.txt
文件,内容如下(每行后面添加了换行符):
Welcome here to learn python.
As you have seen, python is such
a powerful programming language,
and I hope you can learn a lot
from here
------Cyberist
使用下面的代码便可以轻松读取文本中的内容
f = open('test.txt', 'r', encoding='utf-8')
data = f.read()
print(data)
但是有时候文件很大,这样一次性使用read
函数效率并不是很高,这样的话,我们可以使用readline
和readlines
函数,readline
读取文件中的一行,然后文件操作指针移动到下一行的文件开头,readlines
每次读取文件的一行,并返回一个列表,列表的元素为对应的行文本
f = open('test.txt', 'r')
data1 = f.readline()
print(data1)
for text in f.readines():
print(text)
# 输出 data1
# Welcome here to learn python.
# 输出 text
# As you have seen, python is such
# a powerful programming language,
# and I hope you can learn a lot
# from here
# ------Cyberist
在上面的例子中,我们发现,循环中的文本并不是从文本最开始的地方读写的,这个是因为每次读取的时候,文件的操作指针都在移动,操作之后指针并没有重新的指向文件的开头,而是停留在读取之后的位置,如果我们想要重新读取,可以使用seek
来实现
f.seek(0) # -- 文件指针重新回到第一个字符
# 我们也可以定义到想要的位置
f.seek(3) # -- 文件指针定位到第四个字符
反复使用readline
函数可以实现和readlines
类似效果
写入文件
写入文件的时候,我们也需要指定对应的文件路径,并设置文件的操作模式为'w'
,此时如果没有对应的文件,会创建对应的文件
,如果对应的文件已经存在,那么之前文件中的文本便会被清空
,然后调用write
函数便可以轻易的写入文件
data = 'date 2019-11-21'
f.write(data)
使用上述方法,我们可以观察到文件中添加了我们写入的文本
如果我们想要不删除原来的文本,可以指定文件的操作模式为'a'
读写二进制文件
其实读取和写入二进制文本和普通文本是一样的,只是我们在打开文件的时候应该指定文件的操作模式为wb
, rb
,利用二进制的写,我们可以实现对图片的复制,比如以下代码:
f = open('test.png', 'rb')
data = f.read()
f2 = open('test_copy.png', 'wb')
f2.write(data)
在我们对文件进行操作完成之后,我们应该及时使用close
函数对文件进行关闭,以免造成意外的效果
读写文本时除了以上方法之外,我们还有更好的方式,就是使用
with open(...) as file_name
格式,这种方式对文件进行操作之后会自动关闭文件
with open('test.txt', 'r') as file:
data = file.read()
print(data)
练习
下面我们简单的使用文件的操作将从 1 到 1000 所有的斐波拉契数字写入到我们的文件中
with open('data.txt', 'w') as file:
a = 1
b = 1
file.write(str(a)+'\t')
while b < 1000:
file.write(str(b)+'\t')
b, a = a+b, b