问:简述Python文件打开模式 r、 w、 a、 r+、w+、a+之间的区别

答:

1.只读模式 r

文件存在:只读打开,只能执行读操作

文件不存在:报错

# ######## 只读模式r ########
filename = "file_test1"
# 打开文件
f = open(filename, "r", encoding="utf-8")
# 读文件
print(f.read())
# 关闭文件
f.close()

2.只写模式 w

文件存在:文件指针置于开头,清空原数据,写入新数据

文件不存在:创建一个新的空文件,写入数据

【注】:文件的数据不可读

# ######## 只写模式w ########
filename = "file_test2"
# 打开文件
f = open(filename, "w", encoding="utf-8")
# 写入内容
f.write("文件不存在:创建一个新的空文件")
# 关闭文件
f.close()

文件 file_test2 此时的内容:

文件不存在:创建一个新的空文件

3.追加模式 a

文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后

文件不存在:创建一个新的空文件,写入数据

【注】:文件的数据不可读

# ######## 追加模式a ########
filename = "file_test2"
# 打开文件
f = open(filename, "a", encoding="utf-8")
# 以追加内容的方式写入
f.write("追加模式 a \n文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后")
# 关闭文件
f.close()

文件 file_test2 此时的内容:

文件不存在:创建一个新的空文件追加模式 a
文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后

4.读+追加模式 r+

文件存在: 文件指针置于文件的开头,打开一个文件进行读与写(此处“写”的意思是:追加在文件末尾)

文件不存在:报错

【注】:r+ 模式下,文件可写可读,而且写与读不分先后,即随时都可进行读与写。

(1)如果先进行读再进行写,就会从文件的开头开始读,再从文件指针的位置开始写

# ######## 读写模式r+ ########
f = open(filename, "r+", encoding="utf-8")
# 先进行写操作,此时文件指针在文件的开头,就从文件开头开始写
f.write("'utf-8' codec can't decode byte 0xbb")
# 再进行读操作,此时文件指针移动都刚写入的内容的结尾,从该位置开始读
print(f.read())
# 关闭文件
f.close()

此时文件 file_test2 的内容:

'utf-8' codec can't decode byte 0xbb空文件追加模式 a
文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后

代码的输出结果:

空文件追加模式 a
文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后

(2)如果先进行写再进行读,就会从文件的开头开始写(因为此时文件指针至于文件开头),会覆盖文件指针之后的一部分内容;读文件的时候会从文件指针此时的位置开始读。

# ######## 读写模式r+ ########
# 打开文件
f = open(filename, "r+", encoding="utf-8")
# 先进行读操作,此时文件指针在文件的开头,就从文件开头开始读
print(f.read())
# 再进行写操作,此时文件指针移动文件的结尾,从该位置开始写
f.write("'utf-8' codec can't decode byte 0xbb")
# 关闭文件
f.close()

此时文件 file_test2 的内容:

'utf-8' codec can't decode byte 0xbb空文件追加模式 a
文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后'utf-8' codec can't decode byte 0xbb

代码的输出结果:

'utf-8' codec can't decode byte 0xbb空文件追加模式 a
文件存在:文件指针置于文件的结尾,新的内容将会被写入到已有内容之后

5.写读模式 w+

文件存在:文件指针置于文件的开头,打开一个文件从头开始编辑,原有内容会被删除,写入新数据。

文件不存在:创建新文件,写入数据

【注】:

(1)需要先把内容写进文件,再去读文件,也就是说:保证文件有内容后,通过移动文件指针来读自己想要的部分

# ######## 读写模式w+ ########
filename = "file_test3
f = open(filename, "w+", encoding="utf-8")
# 先把内容写进文件
f.write("My name is ElegantSmile")
# 查看文件文件指针位置:此时在文件的末尾
print(f.tell())
# 将文件指针移动到文件的开头,进行读文件
f.seek(0)
print(f.read())

(2)如果文件存在,并且已经有内容,在w+模式下,直接进行读取,原有内容会被删除

# ######## 读写模式w+ ########
filename = "file_test3"
f = open(filename, "w+", encoding="utf-8")
# 文件中已有内容,此时直接进行读文件操作,文件内容会被删除,并且读不到任何内容
print(f.read())

(3)在 w+ 模式下,先写入一部分内容,通过移动文件指针,再进行写入,新的内容会覆盖文件指针之后的原内容

# 打开文件
f = open(filename, "w+", encoding="utf-8")
# 先写入内容
f.write("My name is ken123")
# 移动文件指针到 10
f.seek(10)
# 输出此时的文件指针位置
print(f.tell())
# # 读文件
# print(f.read())
# 写入新的数据,此时新的内容会覆盖 文件指针之后的内容
f.write("\nHis name is ElegantSmile")
print(f.read())
# 关闭文件
f.close()

文件此时的结果:

My name is
His name is ElegantSmile

6.追加读写模式 a+

文件存在:文件指针置于文件的结尾,以追加模式打开文件,新的内容将会被写入到已有内容之后

文件不存在:创建新文件,写入数据

【注】:

(1)如果先进行写再进行读,就会从文件的结尾开始写(因为此时文件指针至于文件的结尾),新的内容将会被写入到已有内容之后;读文件的时候,需要先移动到初始位置或任意非末尾的位置,再进行读操作

# ######## 追加读写模式w+ ########
# 打开文件
f = open(filename,"a+",encoding="utf-8")
# 先写入文件
f.write("\n文件存在:文件指针置于文件的结尾,以追加模式打开文件,新的内容将会被写入到已有内容之后")
# 此时文件指正位于文件的末尾,需要先移动到初始位置或任意非末尾的位置,再进行读操作
f.seek(0)
print(f.read())

(2) 如果先进行读再进行写,就会从文件的开头开始读,再从文件指针的位置开始写

# ######## 追加读写模式w+ ########
# 打开文件
f = open(filename,"a+",encoding="utf-8")
# 先进行读操作,此时文件指正位于文件的末尾,需要先移动到初始位置或任意非末尾的位置
f.seek(0)
print(f.read())
# 再写入内容
f.write("\n文件存在:文件指针置于文件的结尾,以追加模式打开文件,新的内容将会被写入到已有内容之后")

7.总结

(1)r,w 以及 r+,w+ 模式下,打开文件后,文件指针至于文件的开头;

(2)a,a+模式下,打开文件后,文件指针至于文件的结尾;

(3)无论哪种模式,文件的读操作、写操作都与文件指针的位置有关系,只要搞清楚每一个动作前后的文件指针在哪,就能知道接下来的操作会有什么影响。

Python【每日一问】06的更多相关文章

  1. Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词

    #coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...

  2. python每日一函数 - divmod数字处理函数

    python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...

  3. Python全栈day 06

    Python全栈day 06 一.数据类型补充完整 1. 列表(list) 反转reverse list1 = [1,2,3,4,5,6,7,8,9] list1.reverse() print(li ...

  4. 每日一问:Android 消息机制,我有必要再讲一次!

    坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...

  5. 每日一问:谈谈 volatile 关键字

    这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...

  6. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  7. 每日一问:你了解 Java 虚拟机结构么?

    对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...

  8. 每日一问:LayoutParams 你知道多少?

    前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...

  9. 每日一问:简述 View 的绘制流程

    Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...

  10. python每日一练:0007题

    第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...

随机推荐

  1. idea中springboot项目程序入口右键不显示run as的原因

    今天在idea中导入了springboot的项目,但是在程序的入口处右键单击没有出现run  as 的程序启动方式,主要原因在于idea中右面的maven projects中没加载项目,需要点击“+“ ...

  2. AngelToken:区块链技术的突破

    科技进步,直接捅破了政治.金融.军事领域所有的玩法,让工业革命以来形成的规则变得一钱不值. 而且,当下的最重要的技术趋势——区块链.Token.AngelToken,正在引导我们走向全面的失控和未知. ...

  3. Python使用MySQL数据库(新)(转)

    http://www.cnblogs.com/fnng/p/3565912.html 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步 ...

  4. springcloud Ribbon学习笔记一

    上篇已经介绍了如何开发eureka服务并让多个服务进行相互注册,接下来记录如何开发一个服务然后注册到eureka中并能通过ribbon成功被调用 开发一个用户服务并注册到eureka中,用户服务负责访 ...

  5. JavaScript之循环

    我是昨天的小尾巴...https://blog.csdn.net/weixin_42217154/article/details/81182817 3.2 循环结构 循环结构是指在程序中需要反复执行某 ...

  6. webapp js与安卓,ios怎么交互

    ) } } export default { callhandler (name, data, callback) { setupWebViewJavascriptBridge(function (b ...

  7. Binary Search Tree Learning Summary

    BST Definition BST is short for Binary Search Tree, by definition, the value of right node is always ...

  8. Linux搭建SVN环境

    1.安装SVN yun install -y subversion root权限安装 安装成功 验证 svnserve --version 创建SVN版本库 cd /home/kuma/下载 mkdi ...

  9. BZOJ1800:fly 飞行棋 (双指针 组合数)

    pro: 给出圆周上的若干个点,已知点与点之间的弧长,其值均为正整数,并依圆周顺序排列. 请找出这些点中有没有可以围成矩形的,并希望在最短时间内找出所有不重复矩形. N<20; sol:很可能被 ...

  10. go语言入门(Hello World)

    package main import "fmt" func main(){ fmt.Println("Hello world") }