Python基础(十三)——文件操作(open函数、close函数)

article/2025/9/14 2:20:55

本文以Python3以上为学习基础。

目录

1、 使用文件操作第一原则

2、open函数

2.1、文件打开模式

2.1.1、只读模式打开文件——只读(r)

2.1.2、读写模式打开文件——读写模式(r+)

2.1.3、写模式打开文件——写模式(w)

2.1.4、读写模式打开文件——读写模式(w+)

2.1.5、写模式打开文件(追加内容)——写模式(a)

2.1.6、读写模式打开文件(追加内容)——读写模式(a)

 2.2、二进制模式打开文件

3、close()函数


在Linux中所有的东西都存放在文件中。

下面讲解Python中文件的相关知识。

在某个文件夹下面建立了一个文件:zxc.txt。

并且在里面输入了如下内容: 

 我们现在打开文件,并且遍历文件的内容:

可以看到我们把文件的内容遍历出来了。

但是每行代码的内容什么含义呢?

我们一行一行的看。

第一行:

f = open("C:\\Users\\lenovo\\Desktop\\Python_File_test\\zxc.txt")

 第一行就是打开文件,采用的方法是open函数。但是在使用文件操作的时候我们要明确一个原则。

1、 使用文件操作第一原则

使用open函数一定要同时把文件关闭函数close()写上。

为什么呢?我们做个验证。

 这个就是我创建好的文件zxc.txt。

当前的文件内容是空的。

下面我们执行下面的代码。

注意:我只是打开了文件,没有关闭文件。

 为了方便查看。加了一个代码执行结束的提示。

下面我们查看zxc.txt文件的内容。

我们成功输出结果:1 2$

我们下面试着手动修改以下文件。

看到没有,我们的文件被占用。但是是什么占用了呢?

我们利用Windows的资源监视器看看。

 很明显,python占用这个文件。原因就是我们使用open函数带开了这个文件。没有关闭,这个文件一直被占用。

因此我们在使用open函数的时候一定要close文件。否则你一直开着它,就算你不懂也应该能想到一定有问题。具体情况后续介绍。

我们现在知道要close到文件了,但是怎么做呢?我们试试看。

 利用前面的文件句柄 f 进行close。

这时候我们使用Windows的资源监视器看看这个文件的相关进程。

 结果很明显。文件相关进程结束了。

所以我们只要写了open函数,一定要紧跟着写上close()函数。然后在open函数和close函数之间进行添加代码处理,就像下面这样。

这里文件关闭函数也就说了,格式就是:文件对象.close(),例如上例中的f.close()。

2、open函数

继续说open函数,open函数是Python的一个内置函数。用于创建一个file对象(文件对象)。

这里文件对象就是等号前面的 f。这样变量f跟对象文件 zxc.txt 用线连起来了(就是对象引用)。

关于对象的引用和放风筝一样。放风筝的转轮就是f,风筝就是zxc.txt,连接转轮和风筝的线就是Python。这里涉及到Python的深浅拷贝问题,具体可以参考:Python深浅拷贝。

我们现来看open函数的语法格式:

file object = open(file_name [, access_mode][, buffering]
  • file_name:就是你要访问的文件的路径。

在本例中就是zxc.txt的文件路径。

关于这个文件路径的写法,有两种:

(1)open("zxc.txt")

意味着这个文件zxc.txt是在当前文件夹内的。就是你Python程序的所在文件夹。

(2)open("C:\\Users\\lenovo\\Desktop\\Python_File_test\\zxc.txt")

这就是打开其它文件夹内的文件,用相对路径或者绝对路径来表示,从而让python能够找到那个文件。里面的 \ 用了 \\ 表示,是为了防止转义。


  • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。这个参数是非强制的,默认文件访问模式为只读(r)。

可以省略,默认的打开模式是只读(r)。本例中就是只读打开。

其他的文件打开模式参考下表:(表格来源于:菜鸟教程)

模式描述
t文本模式 (默认)。
x写模式,新建一个文件,如果该文件已存在则会报错。
b二进制模式。
+打开一个文件进行更新(可读可写)。
U通用换行模式(不推荐)。
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

 文件打开模式有很多,我们总结一下主要用到的是下面几种。

模式可做操作若文件不存在是否覆盖文件原来内容
r只读报错——
r+可读、可写报错
w只写创建
w+ 可读、可写创建
 
a  只写创建否,追加写
a+可读、可写创建否,追加写

下面我们用例子来看,怎么写。(下面所有的例子,为了方便查看,我把文件创建在和Python程序所在的文件夹里面,这样可以直接写文件名称)


2.1、文件打开模式

2.1.1、只读模式打开文件——只读(r)

文件存在的场合:

 这里我尝试文件中写 hello world。报错意思没有写权限。

文件不存在的场合:

 很明显,出现了文件不存在的错误。

2.1.2、读写模式打开文件——读写模式(r+)

文件存在的场合,zxc.txt文件的内容:

下面我们用读写模式打开文件,并向里面写入hello world。

 这时候文件内容,注意看:光标在h前面。原来的内容被删除。

  

文件不存在的场合:

  很明显,出现了文件不存在的错误。

2.1.3、写模式打开文件——写模式(w)

文件存在的场合,zxc.txt的文件内容:

 下面我们用写模式打开文件,并向里面写入Python。

 文件的内容如下,仔细看:输入的光标位置在最开始。P前面有个光标。

很明显,删除原来的文件内容,重新写入Python,并且把光标放在文件最开始。

 文件不存在的场合:

可以看到我的文件夹里面没有zxc.txt。

  下面我们用写模式打开文件,并向里面写入Python。

 这时候我的文件夹:

 可以看到,自己创建了zxc.txt文件。

文件内容如下,仔细看:输入的光标位置在最开始。P前面有个光标。

 很明显,自己创建了文件,写入Python,并且把光标放在文件最开始。

既然w是写模式,我们试着读取文件内容看看。这时候的文件内容是Python。

很明显,出现文件不能读的错误。 

2.1.4、读写模式打开文件——读写模式(w+)

文件存在的场合,文件内容:

 既然是读写模式(w+),所以我们先读文件内容,再写入Python,然后再读取文件内容。

可以看到我们打印文件内容的时候没有报错,但是没有打印出任何内容?

那我们写入成功了吗?

很明显写入成功了,但是为什么没有打印出来内容?

其实是由于读写机制的问题,当一个文件被读或者写一次后,文件中文件指针指向的是整个文件的末尾,再次读时从末尾开始读的话肯定是什么都到。

文件不存在的场合:可以看到我的文件夹里面没有zxc.txt。

这时候我们验证读写模式(w+)。

可以看到创建了文件zxc.txt。 

 文件内容:


其实文件写模式(w)、读写模式(w+)还可以用作删除文件内容。

因为他们整个工作原理就是把文件原来的内容删除,然后写入新的内容。

如果我们写入的内容为空,那么不就是删除文件内容。

就如同下面这个例子。

文件内容: 

 可以看到,文件zxc.txt里面有无数个Python。

下面我们利用读写模式,但是不写入任何内容。

 这时候我们查看文件内容:

 文件内容是空,原来的内容删掉了。

同理,写模式(w)是一样的。


2.1.5、写模式打开文件(追加内容)——写模式(a)

文件存在的场合,文件内容如下:

 下面我们写入内容 hello world

 文件内容:

 可以看到,Python后面追加了hello world。

文件不存在的场合,可以看到,我的文件夹里没有文件zxc.txt:

 下面我们连续写入内容 hello world 和 Python。

可以看到zxc.txt被创建 

 文件内容:

 既然是写模式,我们验证一下zxc.txt不能读。

出现错误不能读。

2.1.6、读写模式打开文件(追加内容)——读写模式(a)

文件存在的场合,文件内容如下:

 下面我们写入内容 hello world

 文件内容:

 可以看到,Python后面追加了hello world。

文件不存在的场合,可以看到,我的文件夹里没有文件zxc.txt:

 下面我们连续写入内容 hello world 和 Python。

可以看到zxc.txt被创建 

 文件内容:

 既然是读写模式,我们验证一下zxc.txt可读。

 没有出现错误,但是没有打印出内容。

原因其实是由于读写机制的问题,当一个文件被读或者写一次后,文件中文件指针指向的是整个文件的末尾,再次读时从末尾开始读的话肯定是什么都到。


 所有模式我们都进行了说明,我们再看一下回顾一下我们整理的文件打开模式表:

模式可做操作若文件不存在是否覆盖文件原来内容
r只读报错——
r+可读、可写报错
w只写创建
w+ 可读、可写创建
 
a  只写创建否,追加写
a+可读、可写创建否,追加写

对于第三个参数buffering。

buffering的可取值有0,1, >1三个

  • 0代表buffer关闭(只适用于二进制模式,也就是我们文件打开模式中带b的,例如rb【二进制只读模式】)
  • 1代表line buffer(只适用于文本模式,也就是我们文件打开模式中的t)
  • >1表示初始化的buffer大小 

这个参数我没用到过,所以这里我无法进行举例解释了,所以如果需要,还请自行查询。

 2.2、二进制模式打开文件

 我们看到了在文件打开模式中有以下模式:rb、wb……有这种带 b 的。

什么意思呢?

就是用二进制的方式打开文件。

有什么用?

我们来验证一下:
创建文件zxc.txt,内容如下:

下面读取文件:

很明显,我们出现了以下错误:

UnicodeDecodeError: 'gbk' codec can't decode byte 0x82 in position 0: incomplete multibyte sequence

主要原因是因为编码的问题,可能是因为0x82这个字节在gbk编码中没有这个字符,可能原字符是两个字节,在gbk里被解析成了一个字节,导致字符不存在。

解决方法有两个:一个是二进制读取,一个是改编编码方式。

二进制读取就是利用rb、wb……

这就是我们文件打开方式有二进制的原因。

下面我们进行验证。

可以看到,二进制就把文件内容读出来了。并且看到原来是中文的句号在gbk里面没有。

前面的r、w、r+……就是上面讲的读模式、写模式、读写模式等等。配合二进制方式,就可以读取文件了。

3、close()函数

上面文件打开模式例子都有close函数的用法:f.close()。


http://chatgpt.dhexx.cn/article/rGDr9k1R.shtml

相关文章

layer中的open与close

关于layer中的open方法与close方法 open方法open函数的定义open函数里面optionsopen函数中返回的值 close方法如何使用close方法关于layer中的一些发现 写在最后的话 open方法 open函数用来创建一个弹出层。 open函数的定义 形式为:layer.open(options) 例如&…

open函数详解与close函数详解

open() 头文件&#xff1a;#include<fcntl.h>//在centos6.0中只要此头文件就可以#include<sys/types.h>#incldue<sys/stat.h> 功能&#xff1a;打开和创建文件&#xff08;建立一个文件描述符&#xff0c;其他的函数可以通过文件描述符对指定文件进行读取与…

open和close函数

open函数&#xff1a;打开或创建文件 系统调用open可以用来打开普通文件、块设备文件、字符设备文件、链接文件和管道文件&#xff0c;但只能用来创建普通文件&#xff0c;创建特殊文件需要使用特定的函数。 头文件&#xff1a; #include <sys/types.h> #include <…

linux close 头文件,Linux open close read write lseek函数的使用

我们经常需要在Linux中进行文件操作,今天我就来分享下文件操作用到的一些函数 1 open 所需头文件: 函数原型:int open(const char *pathname,flags,int perms) pathname:被打开的文件名,可包含路径 flag :文件打开的方式,参数可以通过“|” 组合构成,但前3 个参数不能互…

linux的open close函数

目录 opencloseopen 参数说明代码 解析报错不用怕,我提供解决思路 前言 开始进入学linux的第一个阶段 第一阶段的 Linux的系统函数 第一节 先讲 open close 函数 open 怎么在liunx查看呢 我们利用下面的命令 linux自带的工具 man 手册 man 1 是普通shell 的命令 比如 ls ma…

简述Java序列化的几种方式

目录 JDK原生的序列化 字符串获取字节流 Protobuf Protostuff Thrift kryo hessian fst JSON字符串序列化 Jackson Gson FastJson 序列化和反序列化在网络传输过程中需要做的事情。 序列化 就是得的 字节流&#xff0c;反序列化就是得的对象。 下面梳理Java编程需要…

java序列化之writeObject 和readObject

什么是序列化和反序列化&#xff1f; 序列化&#xff1a;将对象转化为字节的过程称为序列化过程。 反序列化&#xff1a;将字节转化为对象的过程称为反序列化。 序列化主要应用于网络传输和数据存储的场景。在java中&#xff0c;只有类实现了java.io.serializable接口&#x…

java序列化总结

目录 对象序列化是什么 为什么需要序列化与反序列化 序列化及反序列化相关知识 Java 序列化中如果有些字段不想进行序列化&#xff0c;怎么办&#xff1f; Java序列化接口 java.io.Serializable 使用序列化和serialVersionUID进行类重构 Java外部化接口 java.io.Externa…

java序列化接口Serializable

Serializable接口说明 类的可序列化性通过实现(implements) java.io.Serializable可序列化接口。 没有实现这个接口的类不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身可序列化。 序列化接口没有方法或字段只用于识别可序列化的语义。 为了允许序列化不可序…

Java序列化之serialVersionUID

Java序列化之serialVersionUID 今天讲一讲Java对象中的serialVersionUID&#xff0c;先从序列化讲起。 什么是序列化 序列化&#xff0c;简单的说&#xff0c;就是将一个对象转化&#xff08;编码&#xff09;成可以传输的输出流&#xff08;字节流&#xff09;。而反序列化…

一文了解Java序列化与反序列化

目录 序列化示例有父类的对象序列化Serializable和Externalizable区别序列化和反序列化实现serialVersionUID不一致有什么问题1、先注释掉反序列化代码, 执行序列化代码, 然后User类新增一个属性sex2、再注释掉序列化代码执行反序列化代码3、指定serialVersionUID 序列化字段修…

一篇搞懂java序列化Serializable

序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途&#xff1a; 1&#xff09; 把对象…

Java序列化与数据传输

1&#xff09;什么是序列化 ① 序列化&#xff1a;Java 提供了一种对象序列化的机制&#xff0c;该机制中&#xff0c;一个对象可以被表示为一个字节序列&#xff0c;该字节序列包括该对象的数据、有关对象的类型的信息和存储在对象中数据的类型。 堆内存中的java对象数据&…

java序列化的作用

1.java序列化需要实现Serializaible接口或者Externalizable接口 2.java实现序列化的作用: 1.方便在远程调用时对象的解码与编码,就像new对象之间直接调用&#xff0c;不需要像传输对象之间像JSON转换一样转来转去 2.序列化的能力&#xff1a;为了在程序中能直接以对象的形式进…

Java序列化与反序列化

参考链接&#xff1a; Java 序列化与反序列化_Jacks丶的博客-CSDN博客_java反序列化 1 序列化与反序列化的概念 Java 序列化是指&#xff1a;将对象转化成一个字节序列(二进制数据)的过程。 将序列化对象写入文件之后&#xff0c;可以从文件中读取出来&#xff0c;并且对它…

Java序列化

一、什么是序列化&#xff1f;为什么要序列化&#xff1f; Java 序列化就是指将对象转换为字节序列的过程&#xff0c;而反序列化则是只将字节序列转换成目标对象的过程。 我们都知道&#xff0c;在进行浏览器访问的时候&#xff0c;我们看到的文本、图片、音频、视频等都是通…

【JAVA基础】java基础之-序列化详解

写在前面的话 脑子是个好东西&#xff0c;可惜的是一直没有搞懂脑子的内存删除机制是什么&#xff0c;所以啊&#xff0c;入行多年&#xff0c;零零散散的文章看了无数&#xff0c;却总是学习了很多也忘了很多。 痛定思痛的我决定从今天开始系统的梳理下知识架构&#xff0c;记…

JAVA的序列化

絮叨 Java序列化其实这个用的多不多&#xff0c;我觉得看公司的技术栈吧&#xff0c;如果用的是cloud那套&#xff0c;估计接触的会少点&#xff0c;但是也不是说没有&#xff0c;如果是dubbo那套的话&#xff0c;就多点&#xff0c;上次我们说Netty的编码解码的时候说到了谷歌…

MySQL卸载重新安装会遇到的问题及解决方式

好家伙&#xff0c;全踩雷了&#xff1a; 一.使用cd命令无法进入到其他盘符&#xff1f; 解决&#xff1a;在cd后加/d&#xff0c;两者之间用空格隔开 二.初始化时没有给出密码&#xff1f; 解决&#xff1a;仔细检查my.ini配置文件中的配置命令&#xff0c;一般是配置命令写错…

如何将MySQL卸载干净?

前言 前几天不知道什么情况电脑被莫名下载了MySQL8.0版本导致与本机的MySQL5.0版本冲突&#xff0c;导致MySQL无法正常运行&#xff0c;后来因为没有卸载干净MySQL导致一直下载不成功&#xff0c;导致我晚上失眠&#xff0c;现在让我们进入正题&#xff0c;看看如何将他卸载干…