一、基本文件操作
1. 创建和打开文件
-
想要操作文件,首先需要创建或者打开指定文件,并创建文件对象,python提供了
open()
函数实现这个功能:open(filename, mode, encoding)
-
filename:文件名,绝对路径或相对路径
-
encoding:指定文件打编码方式,默认为GBK
-
mode:可选参数,指定文件的打开方式,默认为
r
值 说明 备注 r 只读方式、文件指针在文件开头 文件必须存在 rb 只读打开二进制文件,文件指针在开头 文件必须存在 r+ 打开文件后可读写文件,文件指针在开头,写时覆盖 文件必须存在 w 只写方式打开文件 文件存在则覆盖,否则创建 wb 只写打开二进制文件 文件存在则覆盖,否则创建 w+ 打开文件后清空原有内容,并对该文件有读写权 文件存在则覆盖,否则创建 a 追加模式打开文件,文件指针在末尾 文件不存在则创建 ab 追加模式打开二进制文件,文件指针在末尾 文件不存在则创建 a+ 读写模式打开,文件指针在末尾 文件不存在则创建
-
-
文件操作结束后,要及时关闭文件,避免造成不必要的破坏
file = open('filename', 'r') # 打开文件 file.close() # 关闭文件
-
使用
with
语句打开文件:打开文件要及时关闭、打开文件抛出异常将导致文件不能正常关闭,python提供了with语句,实现无论打开时的情况是什么样,都能保证在with语句结束后相关资源被正常关闭with expression as target: with-body
expression
:指定一个表达式,可以是打开文件的open()函数target
:指定一个变量,将表达式的结果保存到该变量中with-body
:是with语句后的一系列操作
2. 向文件中写入内容
-
python的文件对象提供了
write()
方法,可以向文件中写入内容但要保证文件的打开方式为w
或a
。其中w
会清空原文件内容,a
会在原文件末尾续写。with open('filename', 'a') as file: file.wirte("i love python")
-
写入文件后需要
close()
方法关闭文件,否则写入的内容仍然保存在缓冲区中,并不会立刻保存到文件中,比如:with open('filename.txt', 'w+') as file: file.write('i love python') print(file.read()) # 读不到数据
通过
w+
创建了一个新的空文件,但是read()
方法并不能成功读取到写入的语句。但是,如果使用下面的语句with open('filename.txt', 'w+') as file: file.write('i love python') file.seek(0) print(file.readline())
就可以读到数据,因为
file.seek(0)
将文件指针放置到开头的同时,默认将缓冲区的数据写入到了文件中 -
通过
flush()
方法,可以强制将缓冲区中的内容写入到文件中,但并不会改变文件指针的位置,比如下面的代码with open('filename.txt', 'w+') as file: file.write('i love python') file.flush() print(file.readline())
也是不能够成功读取到数据的,虽然将内容写入到了文件中,但是由于文件指针处于写入语句的末尾,导致无法直接读取到数据,需要使用下面的代码
with open('filename.txt', 'w+') as file: file.write('i love python') file.flush() file.seek(0) print(file.readline())
才能保证读取到数据。
-
这一节讲的比较鸡肋,只是做一个笔记防止自己后面出现一些不知道怎么回事的bug,主要就三点
- 第一点:
file.write(string)
进行写 - 第二点:写完之后需要
close()
方法将缓冲区写入文件 - 第三点:如果写完之后不想关闭文件就可以进行操作,使用
file.seek()
调节文件指针,会默认执行了一次file.flush()
方法
- 第一点:
3. 读取文件中的内容 (文件打开方式为 r r+)
- **读取指定字符:**文件对象提供
file.read([size])
方法,读取指定个数的字符。size
:可选对象,指定读取的字符数,省略则表示读取全部内容- 可以配合
file.seek()
方法实现读取指定位置、一定字符数的字符
- **读取一行:**文件对象提供
file.readline()
方法读取一行数据,通过回车键定义txt文件中的行,以字符串形式,返回文件指针所在位置开始的行内容 - **读取全部行:**文件对象提供
file.readlines()
方法读取全部行,返回的是一个字符串列表,列表中的每个元素是文件中的每一行的内容