Python可以使用open函数来实现文件的打开,关闭,读写操作;

Python3中的open函数定义为:

  1. open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)

其中mode列表为:

  1. 'r' #open for reading (default)
  2. 'w' #open for writing, truncating the file first
  3. 'x' #create a new file and open it for writing,python3新增
  4. 'a' #open for writing, appending to the end of the file if it exists
  5. 'b' #binary mode
  6. 't' #text mode (default),python3新增
  7. '+' #open a disk file for updating (reading and writing)
  8. 'U' #universal newline mode (deprecated)

这里我们主要关心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的读写操作

1)'r'

只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError);

文件打开后,初始游标位置为0;

每次读都是从游标位置开始读;

如果进行了写操作,会报如下异常:

  1. io.UnsupportedOperation: not writable

2)'w'

只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件,然后开始写;

文件打开后,初始游标位置为0;

每次写都是从游标位置开始写;

如果进行了读操作,首先文件也会被清空,会报如下异常:

  1. io.UnsupportedOperation: not readable

3)‘a’

追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;

文件打开后,初始游标位置为文件结尾;

每次写都是从结尾开始写;

如果进行了读操作,同时报如下异常:

  1. io.UnsupportedOperation: not readable

上面的比较好理解,下面就有点绕了

4)'r+'

读写模式,文件不存在的话,报FileNotFoundError(python2是IOError);

文件打开后,初始游标位置为0;

每次读写都是从游标位置开始;但是对于写操作,类似于替换操作;

看如下代码:

文件内容为:

  1. abcdefg

代码内容为:

  1. f = open('open_mode.txt', 'r+')
  2. f.write('xyz')
  3. f.close()

运行代码后,文件内容变为:

  1. xyzdefg

5)'w+'

只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件;

文件打开后,初始游标位置为0;

每次读写都是从游标位置开始;写操作,类似于替换操作;

6)‘a+’

追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;

文件打开后,初始游标位置为文件结尾;

每次写都是从结尾开始写;

读操作从游标位置开始;

7) 'x'

python3新加

创建文件并写操作,操作必须是不存在的文件,如果操作的文件已存在,则报错FileExistsError

不可读,如果进行了读操作,同时报如下异常:

  1. io.UnsupportedOperation: not readable

最后画一张表格总结一下:

8)'b'

二进制形式读写文件;

写数据时,写入的数据类型必须为字符串类型,其他类型必须通过json(就是符合json格式的字符串)写入

python2与python3对于'b’ mode的行为不同,这和python2与python3的字符串类型有关;事实上,python的字符串类型有两种;

Python2的两种字符串类型,分别叫做str和Unicode,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。

Python2的两种字符串类型,分别叫做byte和str,与python2不同的是,byte实例包含原始的8位值;而str的实例,则包含Unicode字符。

当读写文件采用'b'的模式时,要求必须以二进制形式读写,在python2中,字符串必须为str字符串,python3中必须为byte字符串;所以在python3,'b'模式下这样读写字符串

  1. s = b'hello world!' #注意是byte字符串
  2. f = open('open_mode.txt','wb')
  3. f.write(s)

或:

  1. s = 'hello world!'
  2. f = open('open_mode.txt','wb')
  3. f.write(s.encode(encoding='utf-8'))

不然会报如下错误:

  1. Traceback (most recent call last):
  2. File "C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in <module>
  3. f.write(s)
  4. TypeError: a bytes-like object is required, not 'str'

open的内容还有很多,针对于读,还有个更好的模块linecache用于读取大文件;以后有时间继续扩展

open文件操作之mode模式剖析的更多相关文章

  1. python中文件操作的六种模式及对文件某一行进行修改的方法

    一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...

  2. python 文件操作: 文件操作的函数, 模式及常用操作.

    1.文件操作的函数: open("文件名(路径)", mode = '模式', encoding = "字符集") 2.模式: r , w , a , r+ , ...

  3. C中文件操作的文本模式和二进制模式,到底有啥区别?

    在C中,使用fopen打开文件有两种模式:一种是文本模式,一种是二进制模式.那这两种模式之间有什么区别,是不是使用文本模式打开的文件就只能使用文本函数比如fprintf来操作,而使用二进制打开的文件就 ...

  4. oldboy s21day07(深浅拷贝及文件操作)

    #!/usr/bin/env python# -*- coding:utf-8 -*- # 1.看代码写结果'''v1 = [1, 2, 3, 4, 5]v2 = [v1, v1, v1]v1.app ...

  5. python目录和文件操作

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 要操作目录,必须引入os模块 import os1.得到当前工作目录,即当前Python脚本工作的目录路径: os ...

  6. python-with管理文件上下文(基本文件操作)

    什么是文件 文件是操作系统为用户提供的一个读写硬盘的虚拟单位,文件的操作就是文件的读.写. 操作过程:当我们双击文件 -<- 操作系统接收到指令请求(将用户或应用程序的读写操作转换成集体的硬盘指 ...

  7. Day 09 文件操作

    什么是文件 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位.文件的操作是基于文件,即文件的操作核心就是:读和写.也 就是只要我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应 ...

  8. 八.python文件操作

    一,初识文件操作. 引子: 现在这个世界上,如果可以操作文件的所有软件都消失了,比如word,wps等等,此时你的朋友通过qq给你发过来一个文件,文件名是:美女模特空姐护士联系方式.txt,在座的所有 ...

  9. python04篇 文件操作(二)、集合

    一.文件操作(二) 1.1 利用with来打开文件 # with open ,python 会自动关闭文件 with open('a.txt', encoding='utf-8') as f: # f ...

随机推荐

  1. 安装cocoaPods第三方类库

    *1 检测gem 镜像文件     输入指令: gem sources -l     回车后得到镜像地址.可能是一个,也可能有好几个,常见两个如下 https://rubygems.org/     ...

  2. HTTP学习

    HTTP(HyperText Transfer Protocol)全称"超文本传输协议" HTTP是基于 TCP/IP 协议的应用层协议 现在日常使用版本 HTTP/1.1 一个H ...

  3. 【css】主要的块状元素(block element)和内联元素(inline element行内元素)

      内联元素:只在行内发生作用,设置宽高不起作用,不会影响文字内容,使其换行等.竖直方向和间距也不起作用   display可以强制转换行内元素和块状元素,还可以取消显示none   块元素(bloc ...

  4. XRD 数据处理:使用 Origin 进行多谱图对比

    如果一个实验制备了 4 种不同条件下的样品,并分别测得了它们的 XRD 衍射谱图,那么在数据处理中如何用 Origin 软件得到一张多谱图对比的图呢? 样品间的谱图对比 如果只是谱图样品间对比(以 4 ...

  5. 有关cxf与安卓客户端或者C客户端的中文乱码问题

    前段时间在与C的客户端和安卓的客户端进行联调,首先我的方法接收的是C客户端所传递的数据,但是传递到方法内的中文就变成了乱码(我的方法的编码是utf8),最后通过String a = new Strin ...

  6. react学习01

    react react render()函数返回只能是一个标签(里面可以包其他东西) state(状态) vs props(属性) state 改变,视图改变,state是一个组件里面的状态,然后pr ...

  7. C互质个数

    C互质个数 Time Limit:1000MS  Memory Limit:65536K Total Submit:55 Accepted:27 Description 贝贝.妞妞和康康都长大了,如今 ...

  8. 一个UITableViewCell的简单动画效果

    实现下面UITableViewDelegate的方法: forRowAtIndexPath:(NSIndexPath *)indexPath{ CATransform3D rotation; rota ...

  9. 蓝桥杯算法训练_2的次幂表示+前缀表达式+Anagrams问题+出现次数最多的整数

    今天做了4个简单的题,题目虽然是简单,但是对于我这样的小白,还是有很多东西需要学习的. 2的次幂表示 上面就是题目,题目说的也很清晰了,接下来就是递归的实现: #include<iostream ...

  10. 《撸轮子系列》之LoadPE

    前言 我新书<Python爬虫开发与项目实战>出版了. 这本书包括基础篇,中级篇和深入篇三个部分,不仅适合零基础的朋友入门,也适合有一定基础的爬虫爱好者进阶,如果你不会分布式爬虫,不会千万 ...