一、前言
文件操作对于任何一门语言来说都是一个非常重要的一块内容,毕竟编程本身的目的就是处理数据,而文件就是数据最重要的一个储存形式。
对于一个文件来说,一般都有三个步骤:
- 打开文件
- 操作文件
- 关闭文件
这是所有语言通用的(因为底层操作系统就是这么写的),只是可能各自的实现方式不同而已。
所以接下来我们也就顺着这个逻辑来学习。
1.打开文件
首先是打开文件,函数为open
:
它的函数定义非常复杂:
file
:要打开的文件名(或者路径、又或者文件描述符)。mode
:打开文件的模式,默认为 ‘r’(只读模式)。buffering
:设置缓冲策略。如果设为 0,表示不缓冲;如果设为 1,表示使用行缓冲(仅当读取或写入到网络或文件时才会生效);如果设为 大于1的整数,表示缓冲区大小(以字节为单位)。如果省略或设为 -1,则使用系统默认的缓冲策略。encoding
:用于编码或解码文件的字符编码类型。errors
:在编码或解码文件时出现错误时的处理方式。newline
:控制在文本模式下如何处理换行符。可以是None
(使用系统默认换行符)、‘’(不转换换行符)、‘\n’(转换为 \n)、‘\r’(转换为 \r)、‘\r\n’(转换为 \r\n)。closefd
:设置为 True(默认值)表示在关闭文件时同时关闭文件描述符。如果设置为 False,则只关闭文件,不关闭文件描述符。opener
:用于打开文件的自定义文件打开函数。
由于这个函数过于复杂,所以这里只对常用的几个参数进行示例演示,至于其它剩余参数,大部分情况下你应该都用不到,如果真遇到了,到时候再浏览器搜索一下就好了。
对于绝大多数情况来说,我们只用得到下面三个参数:
- file:就是你想要打开的文件名(路径)
- mode:你想要用什么方式来打开文件,即模式,一般有只读、只写、读写、追加这几种,不填则默认为只读
- encoding:你想要用什么编码格式来打开这个文件,现在一般为
utf-8
编码(全球通用的编码),但依旧还有很多文本采用的本地编码,中国地区的本地编码就是GBK
或GB2312
编码,一般直接指定GBK
即可,它兼容GB2312
需要注意的是,这个参数默认使用本地编码,所以很多时候你不指定这个参数,去处理utf-8编码的文件,就会出错,不理解编码的可以参考文章:编码。
举个例子:
f = open('1.txt', 'r', encoding='utf-8')
它打开后会有个返回值,这个返回值就代表着我们打开的那个文件,后面通过操作这个返回值,就基本等同于操作这个文件了。
设置它的模式为只读r
(read
)
而如果你没有这个1.txt
文件,它就无法用只读的方式打开,此时就会引发异常。
而如果你是单纯想写一个新文件的话,那就用w
(write
)即可:
f = open('1.txt', 'w', encoding='utf-8')
这个时候就不会出现异常了,因为在写模式下,如果文件存在,它就会清空这个文件,如果不存在,那就会自动创建这个文件。
因此用写模式的时候要尤为注意,一但清空了,基本是无法恢复的。
而如果想要用追加的模式,那就是a
(appent
),它可以在已经存在的文件末尾追加数据:
f = open('1.txt', 'a', encoding='utf-8')
它和只读模式差不多,如果文件不存在就会引发异常,作用就是不会清空你原本文件的数据,如果你写如数据,就追加到原文本的最后面。
除此之外,你还可以用读写双模式打开一个文件,即:既可以读,也可以写
f = open('1.txt', 'r+', encoding='utf-8')
f = open('1.txt', 'w+', encoding='utf-8')
上面两句代码是一个意思,你只需要在其后面添加一个+
号,就可以又读、又写了,相当于就是在原本的功能上增强的意思。
除此之外,还有一个二进制模式打开文件:
f = open('1.txt', 'wb', encoding='utf-8')
方法很简单,就是在模式里面添加一个b
字符即可(binary
)
因为它默认是文本模式打开,即你读写文件时会符合字符规则去读写,比如都是一个utf-8
字符,所占用的内存大小却可能是不一样的。
而文件可不一定都是文本数据,比如音乐、视频、图片,这些都是纯粹的二进制格式,此时如果你用文本模式,肯定就会有问题的。
2.读文件
操作文件主要就两种方式:读、写
所以这里分别对其进行介绍。
对于读文件来说,你得先有读权限的模式来打开一个文件,比如:
f = open('1.txt', 'r', encoding='utf-8')
#或:f = open('1.txt', 'r+', encoding='utf-8')
然后就可以通过这个返回的文件对象,看它有哪些读方法的函数:
可以看到,它就四个相关的函数:
read
:普通的正常顺序读文件readline
:一次读一行readable
:判断当前文件是否可读readlines
:按行读取文件中所有数据,并返回一个列表,每一项就是文件中的一行
分别举个例子,首先是最简单的readable
:
f = open('1.txt', 'r', encoding='utf-8')
if f.readable():
print("可读")
else:
print("不可读")
注意,我已经新建了一个1.txt
文本在本项目目录中,所以上面代码才能正常运行:
然后是readline
: