目录

无论是哪种编程语言,IO 操作都是非常重要的部分。I 即Input(输入),O 即Output(输出)。

IO 操作一般分为以下两种:

  • 磁盘IO: 即在磁盘上读写文件。读文件是指将文件内容从磁盘读入内存,写文件是指将内存中的内容写到磁盘。
  • 网络IO: 即文件在网络上传输。网络传输一般会有两种角色,分别是服务端(如HTTP Server)和客户端(如浏览器)。

本节我们主要介绍磁盘IO,即文件读写。

1,open 函数介绍

要想读写文件,首先要打开一个文件。

Python 中的内建函数open 用来打开一个文件,我们可以使用help(open),来查看open 函数的原型,如下:

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

该函数成功调用时会返回一个流stream,用于读写文件等操作;发生错误时会抛出IOError 异常。

被打开的文件占用了系统资源,使用完后要记得close,否则会浪费系统资源。

不管以读模式打开文件,还是以写模式打开文件,成功打开一个文件后,这个可操作文件的流的内部都有一个隐含的指针,一般这个指针会指向文件开头或者文件末尾的位置,表示从文件的哪个位置读写文件。

可以看到,该函数支持8 个参数,但最重要的是前两个参数:

  • file:是指要打开的文件的路径
  • mode:是指以什么模式打开文件,要用引号引住

mode 参数支持的模式(默认为读文本模式,即rt)如下:

  • r:以读模式打开文件(默认方式),指针在文件开头
  • w:以写模式打开文件,如果件已存在,则内容会被清空(指针在文件开头);如果文件不存在,则会创建新文件
  • x:创建一个新文件,并以写模式打开,指针在文件开头,如果文件已存在,则抛出FileExistsError异常
  • a:以写模式打开文件,如果文件已有内容,在写入内容时,会追加到文件末尾(指针在文件末尾)
  • b:以二进制模式打开文件,一般用于读写二进制文件,如图片,视频等
  • t:以文本模式打开文件(默认方式),一般用于读写文本文件
  • +:以读写模式打开文件,指针在文件开头

这些模式还可以组合使用,常见的组合如下:

  • rb:以二进制模式打开一个文件,用于只读
  • r+:打开一个文件,用于读写
  • rb+:以二进制模式打开一个文件,用于读写
  • wb:以二进制模式打开一个文件,用于写
  • w+:打开一个文件,用于读写
  • wb+: 以二进制模式打开一个文件,用于读写
  • ab: 以二进制模式打开一个文件,用于追加
  • a+:打开一个文件用于读写,指针在文件末尾
  • ab+:以二进制模式打开一个文件,用于读写,指针在文件末尾

2,open 函数示例

如下代码,成功打开文件./1.txt:

f = open('./1.txt')

通过type(f)查看open 函数的返回值的类型:

>>> type(file)

可看到,其返回值类型为_io.TextIOWrapper。

我们用dir(f) 来查看对象 f 支持的属性和方法:

>>> dir(file)['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'writelines']

可以通过help(f.方法名) 来查看每个方法的帮助手册,也可以使用help(f) 来查看该对象的所有属性和方法,及其简介。

我们来看一下常用方法的作用:

  • mode:打开文件时的模式
  • name:被打开的文件名
  • close:关闭文件流,并刷新缓冲区中的内容,之后不能再操作文件
  • closed:文件流是否已关闭
  • flush:刷新写缓冲区,只写流与非阻塞流不适用
  • read:读入文件内容
  • readable:是否可读
  • readline:读入一行内容
  • readlines:读入文件所有的行,直至文件末尾
  • seek:移动文件指针的位置
  • seekable:文件指针是否可被移动
  • tell:返回文件指针当前位置
  • truncate:截断文件内容
  • writable:是否可写
  • write:向文件中写入内容
  • writelines:向文件中写入多行

3,关闭系统资源

正确的调用close() 函数是关键的。

在成功打开一个文件后,对该文件进行操作(读写)时,有可能发生异常。

比如我们打开的文件只能用来写,如果用来读,则会发生异常:

>>> f = open('1.txt', 'w')  # 用只读模式打开文件>>> f.readable()            # 查看文件是否可读False                       # 返回 False,表示不可读>>> f.read()                # 读文件,发生异常Traceback (most recent call last):  File "", line 1, in io.UnsupportedOperation: not readable

如果,我们将这段代码写在文件中:

#! /usr/bin/env python3f = open('1.txt', 'w')f.read()f.close()

用python3 来执行,结果如下:

$ python3 Test.py Traceback (most recent call last):  File "Test.py", line 4, in     f.read()io.UnsupportedOperation: not readable

可以看到,在执行到f.read() 这句代码的时候,程序异常退出,那么后边的f.close() 就没有执行到,这就导致程序执行不够完整,系统资源没有关闭。

这时,我们可以用try...finally来处理,如下:

#! /usr/bin/env python3f = open('1.txt', 'w')try:    f.read()except Exception as e:    print('read file err:%s' % e)finally:    f.close()    print('file closed')

上面代码的执行结果如下:

$ python3 Test.py read file err:not readablefile closed

我们将f.close() 这句代码放在了finally 代码块中,这样,不管遇到什么情况,f.close() 这句话总会被执行,就不会导致系统资源泄漏的问题。

4,with 语句使用

为了确保系统资源能够关闭,Python 中提供了with 语句,能够让我们更加安全方面的使用open 函数,而不用关心资源关闭的问题。

with 语句也叫上下文管理器,有了with 语句,我们可以这样使用open 函数:

with open('./1.txt') as f:    print(f.read())

这样的代码,不管在with 语句块内出现怎样的异常,close 函数都会被调用,而我们也不需要自己调用。

使用with 语句,就不再需要使用try...finally 语句,也使得代码更加简洁。

需要特别注意的是,这里的f只能在with 语句块中使用,一旦离开with 语句块,f 就被关闭了。如果在with 语句块之外使用f 进行读写等操作,将出现异常。

如下代码中,f.closed 将返回True:

with open('./1.txt') as f:    passf.closed  # True

5,with 语句原理

为什么open 函数能够使用with 语句?

实际上open 函数能够使用with 语句的原因取决于open 的返回值的类型。我们知道,open 的返回值的类型为_io.TextIOWrapper,而这个类中有两个方法,__enter__ 方法和__exit__ 方法。

我们再来看下with 语句的格式:

with ... as ... :    pass

with 关键字的后边是一个表达式,as 后边是一个变量名,表达式的计算结果会赋值给as 后边的变量。

Python 规定,只要一个类中有__enter__和__exit__ 方法,就可以使用with 语句。with 语句后边的表达式执行完毕后,就会执行__enter__ 方法,在退出with 语句块时,会执行__exit__ 方法。

我们自己编写一个测试类,使其能够使用with 语句:

#! /usr/bin/env python3class TestWith:    def __init__(self):        print('执行__init__')    def __enter__(self):        print('执行__enter__')    def __exit__(self, exc_type, exc_val, exc_tb):        print('执行__exit__')        print('exc_type is %s' % exc_type)        print('exc_val is %s' % exc_val)        print('exc_tb is %s' % exc_tb)

在该类中有三个函数:

  • __init__:构造函数,创建类的对象时调用
  • __enter__:进入with 语句块时会调用
  • __exit__:离开with 语句块时会调用

其中__exit__ 方法有三个参数:

  • exc_type:with 语句块中的代码发生异常时的异常类型
  • exc_val:发生异常时的异常值
  • exc_tb:发生异常时的traceback 类的对象

我们这样使用这个类:

with TestWith() as t:    print('test with')

用python3 来执行,结果如下:

$ python3 Test.py 执行__init__执行__enter__test with执行__exit__exc_type is Noneexc_val is Noneexc_tb is None

可以看到执行步骤是这样的:

  1. 生成该类的对象,执行__init__ 方法
  2. 进入with 语句块,执行__enter__ 方法
  3. 执行with 语句块中的代码
  4. 退出with 语句块,执行__exit__ 方法

因为with 语句块中没有发生异常,所以__exit__ 方法中的 exc_type,exc_val,exc_tb 三个参数均为None。

下面再示范一个with 语句块中出现异常的代码:

with TestWith() as t:    print('test with1...')    1 / 0   # 除数为 0,抛出异常    print('test with2...')

该代码的执行结果如下:

$ python3 Test.py 执行__init__执行__enter__test with1...执行__exit__exc_type is exc_val is division by zeroexc_tb is Traceback (most recent call last):  File "Test.py", line 27, in     1 / 0ZeroDivisionError: division by zero

通过上面的执行结果可以看到,在执行1 / 0 之前,我们不用多说。在执行到1 / 0 时,出现异常,然后会执行__exit__ 方法。

在执行结果中,我们能看到 exc_type,exc_val,exc_tb 三个参数的值,最后抛出Traceback 异常。

with 语句中,抛出异常的语句1 / 0 之后的代码不会再执行。

(完。)

with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写相关推荐

  1. with open新创建的文件在哪找_Python 基本功: 4. 读写文件

    基本功3 教程带你了解了 Python 自带的几种数据类型: 多多教Python:Python 基本功: 3. 数据类型​zhuanlan.zhihu.com 在知道如何在 Python 中创建不同类 ...

  2. python创建文件对象的函数_Python学习笔记之—— File(文件) 对象常用函数

    file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...

  3. python编写代码实现文件的拷贝功能_python利用os模块编写文件复制功能——copy()函数用法...

    我就废话不多说了,大家还是直接看代码吧~ #文件复制 import os src_path=r'E:\Pycharm\python100题\代码' target_path=r'E:\Pycharm\p ...

  4. 计算机一级查找同类型文件,如何快捷找出电脑内的重复文件

    有时特喜欢收集各种软件和资料,但是时间久了,很多软件和资料之前下载过了,后来不记得了,又下载了,这样重复的非常多.这样重复的文件多了,占了大量的磁盘空间,也影响电脑运行性能,当然是要清理掉,但这些文件 ...

  5. python总结教程_python基础教程总结10——文件

    1.打开文件 open(name[mode[,buffing])    参数:  文件,模式,缓冲 1)name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误 1 >>& ...

  6. python写文件字母_不能错过!详解Python文件读写。

    我:小哥哥,之前的文件操作我不是很懂,能详细讲一下吗? 惨绿青年:既然你诚心诚意地问了,我就大发慈悲告诉你吧. 我:??? 惨绿青年:开个玩笑嘛,眼睛不要瞪这么大. 惨绿青年:文件操作其实很简单,使用 ...

  7. load()是python文件操作的函数_python深入(函数,文件操作)

    一.内建函数 1.数学运算类 abs(x)#求绝对值 divmod(a, b)#分别取商和余数 float([x])#将一个字符串或数转换为浮点数.如果无参数将返回0.0 int([x[, base] ...

  8. python写入文件没反应_记第一个问题——python文件无法写入数据

    原博文 2019-11-18 23:47 − import getpass username = input("please input your name:") password ...

  9. python实现文件上传功能_python实现上传下载文件功能

    最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exem ...

最新文章

  1. day38--MySQL基础二
  2. javascript引擎V8精要(2)
  3. work php高性能,RabbitMQ之工作(Work)模式(PHP版)-Go语言中文社区
  4. Linux RHEL6 x64 命令行静默安装 Oracle 12c - 2
  5. linux删除具有指定内容的文件,Linux bash删除文件中含“指定内容”的行功能示例...
  6. c++中正则表达式(regex)
  7. 工作文档化升级为工作列表化
  8. 利用Python切头去尾
  9. 【无标题】通信系统的有效性和可靠性
  10. ValueError: multiclass format is not supported
  11. PhotoShop一键修改4的倍数图片工具
  12. 无线网络摄像头服务器,无线摄像头云服务器
  13. layui表格宽度自适应
  14. zabbix 5系列之snmp监控详解
  15. 像素是什么意思,像素与分辨率的区别
  16. 网络中的IP地址管理策略及其划分
  17. 前端 day 30 html 基础一
  18. 网易云IM(即时通讯) 集成指南(Android)
  19. 海苔和紫菜有什么区别?
  20. 基于javaweb+springboot的医院分诊挂号住院管理系统(java+SpringBoot+FreeMarker+Mysql)

热门文章

  1. css家用电器,家用电器
  2. mysql数据库存储引擎选择_MySQL数据库性能优化之存储引擎选择
  3. [深度学习基础] 深度学习基础及数学原理
  4. 几款不错的VisualStudio2010插件
  5. java B2B2C源码电子商务平台 - Zuul回退机制
  6. 在面试中如何展示虚拟机和内存调优技能
  7. mysql5.7中root密码忘记后修改密码
  8. [IOS]clang diagnostic、Wprotocol ..
  9. zz eclipse.ini内存设置
  10. 获得2007年度的ISA-SERVER MVP