Python【每日一问】06
问:简述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的更多相关文章
- Python每日一练(1):计算文件夹内各个文章中出现次数最多的单词
#coding:utf-8 import os,re path = 'test' files = os.listdir(path) def count_word(words): dic = {} ma ...
- python每日一函数 - divmod数字处理函数
python每日一函数 - divmod数字处理函数 divmod(a,b)函数 中文说明: divmod(a,b)方法返回的是a//b(除法取整)以及a对b的余数 返回结果类型为tuple 参数: ...
- Python全栈day 06
Python全栈day 06 一.数据类型补充完整 1. 列表(list) 反转reverse list1 = [1,2,3,4,5,6,7,8,9] list1.reverse() print(li ...
- 每日一问:Android 消息机制,我有必要再讲一次!
坚持原创日更,短平快的 Android 进阶系列,敬请直接在微信公众号搜索:nanchen,直接关注并设为星标,精彩不容错过. 我 17 年的 面试系列,曾写过一篇名为:Android 面试(五):探 ...
- 每日一问:谈谈 volatile 关键字
这是 wanAndroid 每日一问中的一道题,下面我们来尝试解答一下. 讲讲并发专题 volatile,synchronize,CAS,happens before, lost wake up 为了 ...
- 每日一问:讲讲 Java 虚拟机的垃圾回收
昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...
- 每日一问:你了解 Java 虚拟机结构么?
对于从事 C/C++ 程序员开发的小伙伴来说,在内存管理领域非常头疼,因为他们总是需要对每一个 new 操作去写配对的 delete/free 代码.而对于我们 Android 乃至 Java 程序员 ...
- 每日一问:LayoutParams 你知道多少?
前面的文章中着重讲解了 View 的测量流程.其中我提到了一句非常重要的话:View 的测量匡高是由父控件的 MeasureSpec 和 View 自身的 `LayoutParams 共同决定的.我们 ...
- 每日一问:简述 View 的绘制流程
Android 开发中经常需要用一些自定义 View 去满足产品和设计的脑洞,所以 View 的绘制流程至关重要.网上目前有非常多这方面的资料,但最好的方式还是直接跟着源码进行解读,每日一问系列一直追 ...
- python每日一练:0007题
第 0007 题: 有个目录,里面是你自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来. # -*- coding:utf-8 -*- import os def count ...
随机推荐
- 基于JMH的Benchmark解决方案
原始Benchmark做法 在设计新框架的时候,往往需要评估待接入的组件的性能,这个时候我们可能会利用UnitTest来进行,写一个方法,然后在循环里面跑,利用System.CurrentTimeMi ...
- 记一次前端css样式的三角形的应用
1)面试题是这样的要求用css实现 <section> <div></div> <div></div> </section> & ...
- 解决ios兼容性问题
其实也不算兼容性问题 在做一个手指切换动画时,在安卓显示正常但是在iOS上切换图片时整个页面会向上或向下窜,这样非常印象美观,这种现象是由于ios自带的下拉刷新功能能影响的: 解决方法: 添加阻止事件 ...
- React项目新手指南
对于程序员而言:驼峰和下划线之间是一场宗派战争:大括号是否换行会成为一种党派:逗号写在行尾还是行首的人来自不同星球…… 然而,无规矩不成方圆,任何一个团队,要想有高质量的产出,第一步必须要对一些基本的 ...
- day 06 字符串和列表的方法
一.整形int 定义方式: age=18 #调用age=int(18)的方法,自动调用 n=int("123") #只能转换纯数字类型 二:浮点型float 定义方式 sal ...
- 第一次学习手游开发:Flappy Bird制作
周末有空,学习下手游开发,因为本人压根没有基础,于是找了个视频,跟着教程撸了个Flappy Bird. 感谢 SwiftV课堂 提供的教学视频 源码地址: https://github.com/phe ...
- selenium+grid做分布式测试
一.grid介绍 1.本文用的是selenium-server-standalone-3.8.1.jar 2.Firefox用的55版本和对应的驱动 二.grid使用流程说明比如有个A机器,作用是hu ...
- Python重新安装pip
1). 下载pip安装工具: curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py 2).执行升级命令: python2.7 get-pip. ...
- 软间隔分类——SVM
引入:1. 数据线性不可分:2. 映射到高维依然不是线性可分3. 出现噪声.如图: 对原始问题变形得到#2: 进行拉格朗日转换: 其中α和r是拉格朗日因子,均有不小于0的约束.按照之前的对偶问题的推导 ...
- 使用try和catch捕获异常
Java程序在执行过程中如果出现异常,会自动生成一个异常对象,该异常对象将被自动提交给JVM,当JVM接收到异常对象时,会寻找能处理这一异常的代码,并把当前异常对象交给其处理,这一过程称为捕获(cat ...