要了解文件读写模式,需要了解几种模式的区别,以及对应指针

r : 读取文件,若文件不存在则会报错

w: 写入文件,若文件不存在则会先创建再写入,会覆盖原文件

a : 写入文件,若文件不存在则会先创建再写入,但不会覆盖原文件,而是追加在文件末尾

rb,wb:分别于r,w类似,但是用于读写二进制文件

r+ : 可读、可写,文件不存在也会报错,写操作时会覆盖

w+ : 可读,可写,文件不存在先创建,会覆盖

a+ :可读、可写,文件不存在先创建,不会覆盖,追加在末尾

注意:这里的覆盖是指每次重新打开文件进行操作时覆盖原来的,如果是在打开文件中则不会覆盖

---------------------
作者:07151012
来源:CSDN
原文:https://blog.csdn.net/qq_32648375/article/details/83342094
版权声明:本文为博主原创文章,转载请附上博文链接!

# 打开文件进行操作
with open("a.txt","w") as file:
file.write("")
file.write("")
# 结果为 123456 虽然w操作模式会进行覆盖,但是此时没有 # 再次打开文件进行操作
with open("a.txt","w") as file:
file.write("")
# 结果为 123 此时才是覆盖原来的a.txt

读、写操作时候涉及到指针

指针相关的函数有:seek(x[,y]),x设置指针的位置,y(=0开头,=1中间,=2末尾)

tell(),查询指针的位置

指针注意点:1.每次打开文件默认指针是在开头的,可以通过seek()来设置指针的位置进行读写操作

2. 每次操作都是从当前指针指向位置向后进行读写

例如:使用w模式(覆盖模式)进行写入时,指针会从头开始,写入完,指针指向最后

with open("a.txt","w") as file:
print(file.tell()) //0,写入前指针为0
file.write("") //写入123
print(file.tell()) //3,写入后指针变为3
# a.txt为123 # 重新打开同一个a.txt文件
with open("a.txt","w") as file:
print(file.tell()) //0,写入前指针为0
file.write("") //写入456
print(file.tell()) //3,写入后指针变为3
# a.txt为456

再来看看a模式(非覆盖模式)

with open("b.txt","a") as file:
print(file.tell()) //0,写入前指针为0
file.write("") //写入123
print(file.tell()) //3,写入后指针变为3
# b.txt为123 # 重新打开同一个b.txt文件
with open("b.txt","a") as file:
print(file.tell()) //3,写入前指针为3
file.write("") //写入456
print(file.tell()) //6,写入后指针变为6
# b.txt为123456

所以只要知道指针的起始位置以及最后位置,就能知道文件读取的内容

再来了解一下有关于文件读的时候

read([value]):value为设置内容读取的长度

举个例子(与指针结合起来看)

# 首先我先创建一个a.txt文件,内容为12345678

with open("a.txt","r") as file:
content = file.read(3) // 读取长度为3
next_content = file.read() // 第二次读取
print(content) // 123
print(next_content) // 45678 # 为什么第二次读取的时候结果会是45678呢?
# 在同一个打开文件中,因为第一次读取完,指针指向了3,所以再次读取时候,从指针3开始读取

再来将seek()函数引入,相同例子

# 首先我先创建一个a.txt文件,内容为12345678

with open("a.txt","r") as file:
content = file.read(3)
file.seek(1) // 设置指针位置为1
next_content = file.read() // 第二次读取
print(content) // 123
print(next_content) // 2345678 # 由于seek设置了指针为2,所以第二次读取时候,从指针为2出进行读取了

文件读的操作相关还有readline,readlines,for in遍历

顾名思义 readline就是读取一行,readlines就是读取所有行

文件较大时,可以用readline或for in 遍历,节省内存,但是性能低

文件较大时,可以用read,readlines一次性处理,占用内存大,但是性能高

看了一下几个例子就能理解了:

# 先创建一个多行的txt文件
a.txt:123
456 # for in 方法
with open("a.txt","r") as file:
for i in file:
print(i,end="") //由于每行末尾默认带有换行符,所以end=""设置一下输出样式 // 结果为 123
465 # readline 方法:每次读取一行
with open("a.txt","r") as file:
content = file.readline()
print(content,end="") //123
content1 = file.readline()
print(content1,end="") //456 # readlines 方法
with open("a.txt","r") as file:
lines = file.readlines() // 读取每一行
for line in lines: // 遍历取出每一行
print(line,end="") // 结果为 123
465

以上内容来源于 https://blog.csdn.net/qq_32648375/article/details/83342094

python文件读写模式 --- r,w,a,r+,w+,a+,rb,wb的更多相关文章

  1. 正确理解Python文件读写模式字w+、a+和r+

    w+ 和 r+的差别不难理解.还有a+ +同一时候读写,就可以读又可写,边写边读.边读边写,不用flush,用seek 和 tell可測得. fp = open("a.txt", ...

  2. 【C++】小心使用文件读写模式:回车('\r') 换行('\n')问题的一次纠结经历

    原来没有仔细注意C++读写文件的二进制模式和文本模式,这次吃了大亏.(平台:windows  VS2012) BUG出现: 写了一个程序A,生成一个文本文件F保存在本地,然后用程序B读取此文件计算MD ...

  3. python 文件读写模式r,r+,w,w+,a,a+的区别(附代码示例)

    如下表   模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 ...

  4. python 文件读写模式区别,以及如何边写入边保存flush()

    如表: 模式 可做操作 若文件不存在 是否覆盖 r 只能读 报错 - r+ 可读可写 报错 是 w 只能写 创建 是 w+ 可读可写 创建 是 a 只能写 创建 否,追加写 a+ 可读可写 创建 否, ...

  5. Python文件读写模式

    r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在.可读,可写,可追加. w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件. w+ 打 ...

  6. python 文件读写时用open还是codecs.open

    当我面有数据需要保存时,第一时间一般会想到写到一个txt文件中,当然,数据量比较大的时候还是写到数据库比较方便管理,需要进行网络传输时要序列化,json化.下面主要整理一下平时用的最多的写入到文件中, ...

  7. python文件读写及形式转化和CGI的简单应用

    一丶python文件读写学习笔记 open() 将会返回一个 file 对象,基本语法格式如下: open(filename, mode) filename:包含了你要访问的文件名称的字符串值. mo ...

  8. python 文件读写操作(24)

    以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作.文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(wri ...

  9. 【03】Python 文件读写 JSON

    1 打开文件 文件操作步骤: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 1.1 打开方法 f = open('xxx.txt') #需f.close( ...

随机推荐

  1. SimpleCalendar日历插件改版

    先附上一张货真价实的效果图: 以上部分代码,为了适应我司项目的需求,原来插件源码大改(因为项目中下拉框用了select2,所以原来插件的下拉框就有问题了,在加上原来插件本身就有点问题,特别是农历 .节 ...

  2. scala笔记,主要摘自网络教程

    1.scala是一种纯面向对象的语言,每个值都是对象.对象的数据类型以及行为由类和特质描述 2.类的扩展有2种机制:继承和混入机制 3.scala是一种函数式语言,其函数也能当成值来使用 ==4.sc ...

  3. Virtualbox/Vagrant安装

    它们分别是什么? VirtualBox: 号称是最强的免费虚拟机软件和VM类似. 不仅具有丰富的特色,而且性能也很优异. Vagrant: 是一个基于Ruby的工具,用于创建和部署虚拟化开发环境. 使 ...

  4. 关于对javaUtils封装和三层架构的笔记

    1.什么是三层架构: 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business ...

  5. layui对json数据的格式要求

    layui有自己的一套特定的数据格式交互,必须参数code:0,msg:“”,count:数据size(int),data:”数据List”.**一般我们选择封装返回接收类**. 若想要绑定数据到la ...

  6. Java Swing实战(四)按钮组件JButton及其事件监听

    接下来为面板添加保存按钮,并为按钮绑定事件监听. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public class WeimingSyn ...

  7. K:hash的应用场景

    本博文主要用于讲解Hash的应用场景 Hash主要应用于数据结构中和密码学中. 用于数据结构时,主要是为了提高查询的效率,这就对速度比较重视,对抗碰撞不太看中,只要保证hash均匀分布就可以. 在密码 ...

  8. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  9. 原型链继承中的prototype、__proto__和constructor的关系

    前不久写了有关原型链中prototype.__proto__和constructor的关系的理解,这篇文章说说在原型链继承中的prototype.__proto__和constructor的关系. 通 ...

  10. C#调用SQlite常见问题汇总

    最近在做SQLite开发,开发环境是VS2010+ SQLite Ado.Net data Provider.这套Data Provider程序是基于System.Data.SQLite 1.0.66 ...