8. 文件操作详解

一、前言

文件操作对于任何一门语言来说都是一个非常重要的一块内容,毕竟编程本身的目的就是处理数据,而文件就是数据最重要的一个储存形式。

对于一个文件来说,一般都有三个步骤:

  1. 打开文件
  2. 操作文件
  3. 关闭文件

这是所有语言通用的(因为底层操作系统就是这么写的),只是可能各自的实现方式不同而已。

所以接下来我们也就顺着这个逻辑来学习。

1.打开文件

首先是打开文件,函数为open

image-20240309193242230

它的函数定义非常复杂:

  • file:要打开的文件名(或者路径、又或者文件描述符)。
  • mode:打开文件的模式,默认为 ‘r’(只读模式)。
  • buffering:设置缓冲策略。如果设为 0,表示不缓冲;如果设为 1,表示使用行缓冲(仅当读取或写入到网络或文件时才会生效);如果设为 大于1的整数,表示缓冲区大小(以字节为单位)。如果省略或设为 -1,则使用系统默认的缓冲策略。
  • encoding:用于编码或解码文件的字符编码类型。
  • errors:在编码或解码文件时出现错误时的处理方式。
  • newline:控制在文本模式下如何处理换行符。可以是 None(使用系统默认换行符)、‘’(不转换换行符)、‘\n’(转换为 \n)、‘\r’(转换为 \r)、‘\r\n’(转换为 \r\n)。
  • closefd:设置为 True(默认值)表示在关闭文件时同时关闭文件描述符。如果设置为 False,则只关闭文件,不关闭文件描述符。
  • opener:用于打开文件的自定义文件打开函数。

由于这个函数过于复杂,所以这里只对常用的几个参数进行示例演示,至于其它剩余参数,大部分情况下你应该都用不到,如果真遇到了,到时候再浏览器搜索一下就好了。

对于绝大多数情况来说,我们只用得到下面三个参数:

  1. file:就是你想要打开的文件名(路径)
  2. mode:你想要用什么方式来打开文件,即模式,一般有只读只写读写追加这几种,不填则默认为只读
  3. encoding:你想要用什么编码格式来打开这个文件,现在一般为utf-8编码(全球通用的编码),但依旧还有很多文本采用的本地编码,中国地区的本地编码就是GBKGB2312编码,一般直接指定GBK即可,它兼容GB2312

需要注意的是,这个参数默认使用本地编码,所以很多时候你不指定这个参数,去处理utf-8编码的文件,就会出错,不理解编码的可以参考文章:编码

举个例子:

f = open('1.txt', 'r', encoding='utf-8')

它打开后会有个返回值,这个返回值就代表着我们打开的那个文件,后面通过操作这个返回值,就基本等同于操作这个文件了。

设置它的模式为只读rread

而如果你没有这个1.txt文件,它就无法用只读的方式打开,此时就会引发异常。

image-20240309193536651

而如果你是单纯想写一个新文件的话,那就用wwrite)即可:

f = open('1.txt', 'w', encoding='utf-8')

这个时候就不会出现异常了,因为在写模式下,如果文件存在,它就会清空这个文件,如果不存在,那就会自动创建这个文件。

因此用写模式的时候要尤为注意,一但清空了,基本是无法恢复的。

而如果想要用追加的模式,那就是aappent),它可以在已经存在的文件末尾追加数据:

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')

然后就可以通过这个返回的文件对象,看它有哪些读方法的函数:

image-20240309193704639

可以看到,它就四个相关的函数:

  • read:普通的正常顺序读文件
  • readline:一次读一行
  • readable:判断当前文件是否可读
  • readlines:按行读取文件中所有数据,并返回一个列表,每一项就是文件中的一行

分别举个例子,首先是最简单的readable

f = open('1.txt', 'r', encoding='utf-8')
if f.readable():
    print("可读")
else:
    print("不可读")

注意,我已经新建了一个1.txt文本在本项目目录中,所以上面代码才能正常运行:

image-20240309193802212

然后是readline:

作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux