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

答:

1.只读模式 r

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

文件不存在:报错

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

2.只写模式 w

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

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

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

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

文件 file_test2 此时的内容:

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

3.追加模式 a

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

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

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

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

文件 file_test2 此时的内容:

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

4.读+追加模式 r+

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

文件不存在:报错

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

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

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

此时文件 file_test2 的内容:

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

代码的输出结果:

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

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

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

此时文件 file_test2 的内容:

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

代码的输出结果:

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

5.写读模式 w+

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

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

【注】:

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

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

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

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

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

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

文件此时的结果:

  1. My name is
  2. His name is ElegantSmile

6.追加读写模式 a+

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

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

【注】:

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

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

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

  1. # ######## 追加读写模式w+ ########
  2. # 打开文件
  3. f = open(filename,"a+",encoding="utf-8")
  4. # 先进行读操作,此时文件指正位于文件的末尾,需要先移动到初始位置或任意非末尾的位置
  5. f.seek(0)
  6. print(f.read())
  7. # 再写入内容
  8. 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. Spring Boot + Spring Cloud 实现权限管理系统 (Spring Security 版本 )

    技术背景 到目前为止,我们使用的权限认证框架是 Shiro,虽然 Shiro 也足够好用并且简单,但对于 Spring 官方主推的安全框架 Spring Security,用户群也是甚大的,所以我们这 ...

  2. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  3. 特殊场景Sql优化

    一.大表的大数据量修改 问题: 1.大量的行级锁,长时间阻塞   2.主从延时,大批数据不一致 解决方法: 分批次修改 二.大表的表结构修改 问题:长时间锁表 解决方法: 1.从库修改,主从切换,主库 ...

  4. HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索

    //hdu5616 void solve1(){dp[0]=1;for(int i=1;i<=n;i++){for(int j=INF;j>=val[i];j--){dp[j]|=(dp[ ...

  5. spring集成jedis简单实例

    jedis是redis的java客户端,spring将redis连接池作为一个bean配置. redis连接池分为两种,一种是“redis.clients.jedis.ShardedJedisPool ...

  6. mount: mounting proc on /proc failed: Device or resource busy

    /********************************************************************** * mount: mounting proc on /p ...

  7. N!分解质因子p的个数_快速求组合数C(n,m)

    int f(int n,int p) { ) ; return f(n/p,p) + n/p; } https://www.xuebuyuan.com/2867209.html 求组合数C(n,m)( ...

  8. Golang基础之函数

    golang基础之函数 1.为什么需要函数? 有些相同的代码可能出现多次,如果不进行封装,那么多次写入到程序中,会造成程序冗余,并且可读性降低 2.什么是函数 为完成某些特定功能的程序指令集合称为函数 ...

  9. CCF-20170903-JSON查询

    这道题当时考ccf,五道题中做的时间最长的一道题....可惜最好只有0分!! 后来重现写了一下--(110行超级麻烦 主要思想:就是先对括号经行匹配,创建的时候分为创建表和创建元素两种情况,难点在于对 ...

  10. css自定义checkbox和radio样式

    很常见的问题,也有许多人写过类似的文章,自己写来记录下 css代码如下: #myCheck + label,.myRadio + label{ width:16px; height:16px; bor ...