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

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

最新文章

  1. (十一)WebGIS中要素(Feature)的设计
  2. sql group by datetime on day
  3. [转]JavaScript字符串函数大全
  4. asp中 grideview 更新 无法获取值 解决办法
  5. SQL服务器更改名称后
  6. BZOJ 1709: [Usaco2007 Oct]Super Paintball超级弹珠
  7. 玩转Android之数据库框架greenDAO3.0使用指南
  8. iOS开发学习--纯代码 UIScrollView 无限循环的实现——代码类封装
  9. O - Marriage Match IV - hdu 3416(最短路+最大流)
  10. 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示
  11. IOS中UIScrollView的contentSize、contentOffset和contentInset属性
  12. C++智能指针剖析(上)std::auto_ptr与boost::scoped_ptr
  13. LODOP设置判断后执行哪个
  14. Java WEB ----- 文件的上传
  15. centos安装jdk步骤
  16. javascript的作用域和优先级
  17. react中直接调用子组件的方法(非props方式)
  18. Golang如何使用websocket
  19. 教你如何自学UI设计
  20. 使用MYSQL的INNODB实现任务分发机制

热门文章

  1. ubuntu上安装R的时候遇到的问题总结
  2. Python——爬虫学习1
  3. jQuery 关于ajaxfileupload.js插件的逐步解析(ajaxfileupload.js第二弹)
  4. [javaSE] 数据结构(二叉查找树-插入节点)
  5. 十四、ReentrantLock重入锁
  6. hadoop fs -put localfile . 时出现如下错误: could only be replicated to 0 nodes, instead of 1
  7. Server 2008 r2 多用户远程桌面配置
  8. Win10环境下Redis和Redis desktop manager 安装
  9. arguments 参数
  10. HiJson工具 && 火狐浏览器中的jsonHandle插件(以及乱码问题的解决)-->来转换json串的格式