open文件操作之mode模式剖析
Python可以使用open函数来实现文件的打开,关闭,读写操作;
Python3中的open函数定义为:
open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
其中mode列表为:
'r' #open for reading (default)
'w' #open for writing, truncating the file first
'x' #create a new file and open it for writing,python3新增
'a' #open for writing, appending to the end of the file if it exists
'b' #binary mode
't' #text mode (default),python3新增
'+' #open a disk file for updating (reading and writing)
'U' #universal newline mode (deprecated)
这里我们主要关心一下'r', 'w', 'a', 'r+', 'w+', 'a+', 'x',很多人容易混淆不同模式的读写操作
1)'r'
只读模式,open函数中mode参数的默认模式,文件不存在的话,报FileNotFoundError(python2是IOError);
文件打开后,初始游标位置为0;
每次读都是从游标位置开始读;
如果进行了写操作,会报如下异常:
io.UnsupportedOperation: not writable
2)'w'
只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件,然后开始写;
文件打开后,初始游标位置为0;
每次写都是从游标位置开始写;
如果进行了读操作,首先文件也会被清空,会报如下异常:
io.UnsupportedOperation: not readable
3)‘a’
追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
如果进行了读操作,同时报如下异常:
io.UnsupportedOperation: not readable
上面的比较好理解,下面就有点绕了
4)'r+'
读写模式,文件不存在的话,报FileNotFoundError(python2是IOError);
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;但是对于写操作,类似于替换操作;
看如下代码:
文件内容为:
abcdefg
代码内容为:
f = open('open_mode.txt', 'r+')
f.write('xyz')
f.close()
运行代码后,文件内容变为:
xyzdefg
5)'w+'
只写模式,文件不存在的话,创建文件;文件存在的话,首先清空文件;
文件打开后,初始游标位置为0;
每次读写都是从游标位置开始;写操作,类似于替换操作;
6)‘a+’
追加模式,文件不存在话,创建文件;文件存在的话,不会清空文件;
文件打开后,初始游标位置为文件结尾;
每次写都是从结尾开始写;
读操作从游标位置开始;
7) 'x'
python3新加
创建文件并写操作,操作必须是不存在的文件,如果操作的文件已存在,则报错FileExistsError
不可读,如果进行了读操作,同时报如下异常:
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'模式下这样读写字符串
s = b'hello world!' #注意是byte字符串
f = open('open_mode.txt','wb')
f.write(s)
或:
s = 'hello world!'
f = open('open_mode.txt','wb')
f.write(s.encode(encoding='utf-8'))
不然会报如下错误:
Traceback (most recent call last):
File "C:/Users/Desktop/Python/cnblogs/数据类型.py", line 125, in <module>
f.write(s)
TypeError: a bytes-like object is required, not 'str'
open的内容还有很多,针对于读,还有个更好的模块linecache用于读取大文件;以后有时间继续扩展
open文件操作之mode模式剖析的更多相关文章
- python中文件操作的六种模式及对文件某一行进行修改的方法
一.python中文件操作的六种模式分为:r,w,a,r+,w+,a+ r叫做只读模式,只可以读取,不可以写入 w叫做写入模式,只可以写入,不可以读取 a叫做追加写入模式,只可以在末尾追加内容,不可以 ...
- python 文件操作: 文件操作的函数, 模式及常用操作.
1.文件操作的函数: open("文件名(路径)", mode = '模式', encoding = "字符集") 2.模式: r , w , a , r+ , ...
- C中文件操作的文本模式和二进制模式,到底有啥区别?
在C中,使用fopen打开文件有两种模式:一种是文本模式,一种是二进制模式.那这两种模式之间有什么区别,是不是使用文本模式打开的文件就只能使用文本函数比如fprintf来操作,而使用二进制打开的文件就 ...
- oldboy s21day07(深浅拷贝及文件操作)
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.看代码写结果'''v1 = [1, 2, 3, 4, 5]v2 = [v1, v1, v1]v1.app ...
- python目录和文件操作
一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 要操作目录,必须引入os模块 import os1.得到当前工作目录,即当前Python脚本工作的目录路径: os ...
- python-with管理文件上下文(基本文件操作)
什么是文件 文件是操作系统为用户提供的一个读写硬盘的虚拟单位,文件的操作就是文件的读.写. 操作过程:当我们双击文件 -<- 操作系统接收到指令请求(将用户或应用程序的读写操作转换成集体的硬盘指 ...
- Day 09 文件操作
什么是文件 文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位.文件的操作是基于文件,即文件的操作核心就是:读和写.也 就是只要我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应 ...
- 八.python文件操作
一,初识文件操作. 引子: 现在这个世界上,如果可以操作文件的所有软件都消失了,比如word,wps等等,此时你的朋友通过qq给你发过来一个文件,文件名是:美女模特空姐护士联系方式.txt,在座的所有 ...
- python04篇 文件操作(二)、集合
一.文件操作(二) 1.1 利用with来打开文件 # with open ,python 会自动关闭文件 with open('a.txt', encoding='utf-8') as f: # f ...
随机推荐
- 现在,以编程方式在 Electron 中上传文件,是非常简单的!
必要的上下文 想尽快熟悉上下文语境的,可以点这里: https://github.com/electron/electron/issues/749 这段讨论,其实本来是讨论如何自动设置 input 标 ...
- Java 多态的实现原理
一个对象变量可以指示多种实际类型的现象称为多态 允许不同类的对象对同一消息做出响应.方法的重载.类的覆盖正体现了多态. 1.多态的机制 1.1 本质上多态分两种 .编译时多态(又称静态多态) .运行时 ...
- Ubuntu上安装PHP环境-mysql+apache+php-Linux操作系统
安装MYSQL 1. sudo apt-get install mysql-server 或者 apt-get isntall mysql-client 2. 安装过程中会提示设置密码,注意设 ...
- AC自动机总结及板子(不带指针)
蒟蒻最近想学个AC自动机简直被网上的板子搞疯了,随便点开一个都是带指针的,然而平时用到指针的时候并不多,看到这些代码也完全是看不懂的状态.只好在大概理解后自己脑补(yy)了一下AC自动机的代码,居然还 ...
- 蓝桥杯比赛javaB组练习《方格填数》
方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ ( ...
- 暑假集训D11总结
%dalao 今天某学长来讲一个极其高深的数据结构——线段树(woc哪里高深了),然而并没有时间整理笔记= =,所以明天在扔笔记咯= = 考试 今天考试,一看数据范围,woc暴力分给的真足,然后高高兴 ...
- xmake v2.1.5版本正式发布,大量新特性更新
此版本带来了大量新特性更新,具体详见:xmake v2.1.5版本新特性介绍. 更多使用说明,请阅读:文档手册. 项目源码:Github, Gitee. 新特性 #83: 添加 add_csnippe ...
- Handler案例-简易打地鼠游戏(延时处理消息)
1. 游戏思路 (1)用ImageView显示地鼠,初始状态将ImageView设置为不可见状态.当开始游戏后,通过sendMessageDelayed()方法延时发送消息,使ImageView显示出 ...
- WebGIS中前端JS生成等值面方法探讨
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在之前的博文<WebGIS中等值面展示的相关方案简析&g ...
- LinkQueue(链队列)
关于Node.h,请参考LinkStack #include"Node.h" template<typename ElemType> class LinkQueue { ...