原文链接:blog.ouyangsihai.cn >> 带你学python基础:文件读写,俗称IO操作
这一节讲个挺有意思的知识,至少在我以前刚刚接触编程的时候,对于文件操作还是觉得很有意思的事情,这也许是有一种操作文件的激情吧,希望看到这篇文章的读者也会有这样的激情,说明还是很有兴趣的,当然,就算没有,可能是你的兴趣点不在这。
一、文件的打开
首先,我们还是从文件的打开与关闭讲起。讲这个之前,我们先了解一下文件操作的大致流程,这个流程不止 Python 是这样的,几乎所有的编程语言的操作都是这样的,有了这样的一个流程,再写程序的时候,思路就豁然开朗了。
从这个图我们可以看出,文件操作一般会经历打开文件、读写数据、关闭文件,这样的大概的流程,所以,下面的知识,我们就按照这个流程一一讲解涉及的知识点。
一提到文件打开,我们就会想到 open()
这个函数,打铁趁热,我们就将一下这个函数的用法。
open()
函数语法
open(name[, mode[, buffering[,encoding]]])
参数解释
- name : 访问的文件名称的字符串值(区分绝对路径和相对路径)。
- mode : mode 决定了打开文件的模式:只读,写入,追加等。
- buffering : 如果 buffering 的值被设为 0,就不会有寄存。如果 buffering 的值取 1,访问文件时会寄存行。如果将 buffering 的值设为大于 1 的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。
实践是检验真理的唯一标准
# -*- coding:utf-8 -*-
# 新建打开文件操作,打开文件hello.txt,以读取的模式打开
f = open('./hello.txt', 'r')
是不是易如反掌,这里只是打开了这个文件,还没有进行任何的操作,文件操作待我娓娓道来,这个实例中用到了文件读取的模式,介绍一下常用的模式。
注意:对于初学者来说,需要注意的是,模式b
的意思是代表二进制读写,+
直接代表读写,也就是有读取和写入两个操作。也许你不理解什么是二进制读写,这里讲一下,数据的保存是有文本字符保存和二进制保存的,所以,在读写的时候,自然也就有两种读写方式了。具体的可以查查资料,学过 C 或者 C++ 就很清楚了。
高级的打开open
这里为什么说高级的打开呢?
在前面说到的文件操作流程中,是不是不可避免的都需要自己去执行关闭文件操作呢?其实不是的,在 Python 中提供了一种更加方便的形式,不需要手动的去关闭文件。
语法
with…open
实践是检验真理的唯一标准
with open('./hello.txt', 'r') as f:
print(f)
注意:这里的as
和前面提到过的as是异曲同工的,都是起到别名的作用。
至于为什么需要这种写法,就是可以避免每次需要手动关闭文件,这种方式会在需要的时候自动关闭。
二、文件的操作
文件操作流程第一步文件打开相信理解透彻了,接下来就是重头戏文件的操作了。
文件读取
read()方法
read的使用方法异常简单
read(num)
read()
可以读取文件里面的内容。num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据。
实践是检验真理的唯一标准
这里接着上面打开的流程接着写程序。
with open('./hello.txt', 'r') as f:
# 如果不写入参数,代表读取全部内容
str = f.read()
print(str)
print('*' * 10)
# 读取4字节
str2 = f.read(4)
print(str2)
哪还有其他的读取方式吗?
readline()/readlines()
- readline:读取第一行,返回一个字符串。
- readlines:按照行的方式读取整个文件,每一行作为列表的一个元素,最后返回一个列表。
实践是检验真理的唯一标准
# 使用readlines
with open('./hello.txt', 'r') as f:
content = f.readlines()
print('类型:', type(content))
for i in content:
print(i)
print('*' * 20)
# 使用readline
with open('./hello.txt', 'r') as f:
content = f.readline()
print('类型:', type(content))
for i in content:
print(i)
文件写入
write()方法和writelines(seq)方法
这两个方式都是用于文件写入的。需要注意的是,他们写完后在文件末尾都不会写入换行符。
# 文件写入
with open('./hello.txt', 'a') as f:
f.write('12345617777')
f.writelines('I love you ! ')
print('*' * 20)
# 使用readlines读取
with open('./hello.txt', 'r') as f:
content = f.readlines()
for i in content:
print(i)
可见不会自动加入换行符!
其他实用操作
在某些场景下,可能我们需要更加方便的处理文件,例如,当我们读取文件一半的时候,我们需要读文件的后面具体的某些内容,这时候,我们就需要移动文件的指针来读取了。当然,都不用担心,python 都提供了这些方法,下面就讲解这些方法。
这里需要介绍几个方法。
tell()
返回文件游标操作的当前位置,以文件的开头为原点。seek(offset[,whence])
移动指针方法。
offset :开始的偏移量,也就是代表需要移动偏移的字节数
whence:可选,默认值为 0。给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
实践是检验真理的唯一标准
例如,我们不从文件开头读取,从10个文字后开始读取
with open('./hello.txt', 'r') as f:
f.seek(10, 0)
print('当前位置:', f.tell())
content = f.read()
print(content)
最后再讲两个函数。
flush()
把缓冲区的内容写入硬盘。truncate()
把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。如果size比文件的大小还要大,依据系统的不同可能是不改变文件,也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
三、文件关闭
文件关闭是指,在文件操作完成之后,需要关闭。其实,看完前面的内容,文件关闭似乎不太重要了。那么如何使用呢,非常简单。
文件对象.close()
# 新建打开文件操作,打开文件hello.txt,以读取的模式打开
f = open('./hello.txt', 'r')
f.close()
文件操作的内容就这么多了!!!over!