with open新创建的文件在哪找_Python 简明教程——24,Python 文件读写
目录
无论是哪种编程语言,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
可以看到执行步骤是这样的:
- 生成该类的对象,执行__init__ 方法
- 进入with 语句块,执行__enter__ 方法
- 执行with 语句块中的代码
- 退出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 文件读写相关推荐
- with open新创建的文件在哪找_Python 基本功: 4. 读写文件
基本功3 教程带你了解了 Python 自带的几种数据类型: 多多教Python:Python 基本功: 3. 数据类型zhuanlan.zhihu.com 在知道如何在 Python 中创建不同类 ...
- python创建文件对象的函数_Python学习笔记之—— File(文件) 对象常用函数
file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数: 1.file.close() close() 方法用于关闭一个已打开的文件.关闭后的文件不能再进行读写操作, 否则会触 ...
- python编写代码实现文件的拷贝功能_python利用os模块编写文件复制功能——copy()函数用法...
我就废话不多说了,大家还是直接看代码吧~ #文件复制 import os src_path=r'E:\Pycharm\python100题\代码' target_path=r'E:\Pycharm\p ...
- 计算机一级查找同类型文件,如何快捷找出电脑内的重复文件
有时特喜欢收集各种软件和资料,但是时间久了,很多软件和资料之前下载过了,后来不记得了,又下载了,这样重复的非常多.这样重复的文件多了,占了大量的磁盘空间,也影响电脑运行性能,当然是要清理掉,但这些文件 ...
- python总结教程_python基础教程总结10——文件
1.打开文件 open(name[mode[,buffing]) 参数: 文件,模式,缓冲 1)name: 是强制选项,模式和缓冲是可选的 #如果文件不在,会报下面错误 1 >>& ...
- python写文件字母_不能错过!详解Python文件读写。
我:小哥哥,之前的文件操作我不是很懂,能详细讲一下吗? 惨绿青年:既然你诚心诚意地问了,我就大发慈悲告诉你吧. 我:??? 惨绿青年:开个玩笑嘛,眼睛不要瞪这么大. 惨绿青年:文件操作其实很简单,使用 ...
- load()是python文件操作的函数_python深入(函数,文件操作)
一.内建函数 1.数学运算类 abs(x)#求绝对值 divmod(a, b)#分别取商和余数 float([x])#将一个字符串或数转换为浮点数.如果无参数将返回0.0 int([x[, base] ...
- python写入文件没反应_记第一个问题——python文件无法写入数据
原博文 2019-11-18 23:47 − import getpass username = input("please input your name:") password ...
- python实现文件上传功能_python实现上传下载文件功能
最近刚学python,遇到上传下载文件功能需求,记录下! django web项目,前端上传控件用的是uploadify. 文件上传 - 后台view 的 Python代码如下: @csrf_exem ...
最新文章
- day38--MySQL基础二
- javascript引擎V8精要(2)
- work php高性能,RabbitMQ之工作(Work)模式(PHP版)-Go语言中文社区
- Linux RHEL6 x64 命令行静默安装 Oracle 12c - 2
- linux删除具有指定内容的文件,Linux bash删除文件中含“指定内容”的行功能示例...
- c++中正则表达式(regex)
- 工作文档化升级为工作列表化
- 利用Python切头去尾
- 【无标题】通信系统的有效性和可靠性
- ValueError: multiclass format is not supported
- PhotoShop一键修改4的倍数图片工具
- 无线网络摄像头服务器,无线摄像头云服务器
- layui表格宽度自适应
- zabbix 5系列之snmp监控详解
- 像素是什么意思,像素与分辨率的区别
- 网络中的IP地址管理策略及其划分
- 前端 day 30 html 基础一
- 网易云IM(即时通讯) 集成指南(Android)
- 海苔和紫菜有什么区别?
- 基于javaweb+springboot的医院分诊挂号住院管理系统(java+SpringBoot+FreeMarker+Mysql)
热门文章
- css家用电器,家用电器
- mysql数据库存储引擎选择_MySQL数据库性能优化之存储引擎选择
- [深度学习基础] 深度学习基础及数学原理
- 几款不错的VisualStudio2010插件
- java B2B2C源码电子商务平台 - Zuul回退机制
- 在面试中如何展示虚拟机和内存调优技能
- mysql5.7中root密码忘记后修改密码
- [IOS]clang diagnostic、Wprotocol ..
- zz eclipse.ini内存设置
- 获得2007年度的ISA-SERVER MVP