Python学习教程7:文件存储I/O流程及异常捕获
文件存储(I/O函数)
什么是I/O?
I/O对应英文输入和output的缩写。代表进入和退出。对应我们文件的读写过程。
当我们读取文件时,程序会针对我们要读取的文件,通过输入流使用它,将文本读入缓存区以供以后调用。
当我们写入文件时,程序将缓冲区中的数据通过输出流写入到我们的目标文件中。
Python键盘输入
Python有两个等待键盘的函数,raw_input和input。它们具有相同的效果。他们记录键盘输入并返回结果。
s=raw_input('请输入任意内容:\n')
print '输出:'+s
>>>请输入任意内容:
hello
输出:hello
复制代码
raw_input 函数返回一个字符串对象。我们可以直接打印输入的结果。
s=input('请输入任意内容:\n')
print '输出:',s
>>>请输入任意内容:
5*6
输出: 30
复制代码
输入函数返回一个对象。它与raw_input的主要区别在于它可以输入表达式并返回表达式的结果。
Python 文件函数
Python 文件 函数由文件对象处理。
open函数
file object = open(file_name [, access_mode][, buffering])
复制代码
Python提供了一个内置函数open来获取文件对象。下面我们详细解释一下这个参数的操作。
- file_name 文件路径。它代表我们要写入的文件或我们要读取的文件的名称。注意:这里的路径是相对于我们程序所在目录的路径的相对路径。
- access_mode 文件打开模式。可以将其留空。默认设置为只读。也可以基于需求变更,以下都是条件。
状态 | 描述 |
---|---|
r | 以只读模式打开文件。文件指针位于文件的开头。这是默认模式。 |
rb | 以二进制只读格式打开文件。文件指针位于文件的开头。这是默认模式。 |
r+ | 打开文件进行读写。文件指针位于文件的开头。 |
rb+ | 以二进制格式打开文件以进行读写。文件指针位于文件的开头。 |
w | 打开文件仅供写入。如果该文件已经存在,它将被覆盖。如果该文件不存在,则创建一个新文件。 |
wb | 以二进制格式打开文件,仅用于写入。如果该文件已经存在,它将被覆盖。如果该文件不存在,则创建一个新文件。 |
w+ | 打开文件进行读写。如果该文件已经存在,它将被覆盖。如果该文件不存在,则创建一个新文件。 |
wb+ | 以二进制格式打开文件以进行读写。如果该文件已经存在,它将被覆盖。如果该文件不存在,则创建一个新文件。 |
a | 打开附件文件。如果文件已经存在,则文件指针放置在文件末尾。换句话说,新内容是写在现有内容之后的。如果该文件不存在,则创建一个新文件进行写入。 |
ab | 打开二进制格式的文件作为附件。如果文件已经存在,则文件指针放置在文件末尾。换句话说,新内容是写在现有内容之后的。如果该文件不存在,则创建一个新文件进行写入。 |
a+ | 打开文件进行读写。如果文件已经存在,则文件指针放置在文件末尾。该文件以添加模式打开。如果该文件不存在,则创建一个新文件以供读写。 |
ab+ | 以二进制格式打开文件进行添加。如果文件已经存在,则文件指针放置在文件末尾。如果该文件不存在,则创建一个新文件以供读写。 |
- buffering 用于设置缓存策略。在二进制模式下,使用0来切换缓冲;在文本模式下使用行缓冲1(固定大小缓冲区)。当不给定参数时,底层设备决定二进制文件缓冲区的大小,可以通过 io.DEFAULT_BUFFER_SIZE 获取,通常为 4096 或 8192 字节
举个简单的例子:(test.py 文件代码)
test.py文件代码,f/b
f=open('f/b.txt') #我们读取本模块目录下的f文件夹中的b.txt文件,其他两个参数默认
print f
prin io.DEFAULT_BUFFER_SIZE
>>> <open file 'f/b.txt', mode 'r' at 0x1028581e0> #可以发现文件对象默认模式是r
8192 #设备默认缓冲区为8192字节(注意,这里需要导入io模块才可使用io函数)
复制代码
与文件对象相关的函数
通过Python的open函数,我们得到一个File对象,文件对象执行时带有文件存储函数。文件对象常用的函数有几个,下面一一解释:
close函数
close函数的任务是更新缓冲区并关闭文件对象的操作流程。之后就不能再进行读写操作了。当这个文件对象定义了一个新的文件对象时,该文件对象首先关闭之前的文件对象。因此,我们在对文件进行操作时,应该养成良好的关闭习惯,即调用关闭函数
f=open('f/b.txt')
f.close()
复制代码
write函数
Write函数是写入文件对象数据的函数。该函数允许我们将字符串数据或二进制数据写入文件夹。值得注意的是,如果我们需要数据进行换行,我们还需要编写换行符。这个函数需要对文件有写权限
f=open('f/b.txt','a+') #这里我们制定了文件模式是读写模式(具体可参考上面的表),并且指针放在末尾
f.write('我是一个小小的python爱好者,我在学习python')
f.write('虽然学习之路艰辛\n但我不放弃') #注意这里我们中间加了一个换行符
f.close() #操作完毕关闭对象
复制代码
上面的代码执行完之后,就可以打开对应目录下的b.txt文件来查看其内容了:(不过我不会放弃这句话,因为它被分成单独一行)
我是一个小小的python爱好者,我在学习python虽然学习之路艰辛
但我不放弃
复制代码
读取函数
f.read(n) #参数n表示读取的文件长度,这里的长度是字节长度,参数不填的时候默认为默认缓冲区大小,上面我们打印过,是8192个字节长度
复制代码
提示:gbk编码的汉字占用两个字节,utf-8编码的汉字占用三个字节。 (如果要打印完整的utf-8字符,最小长度必须为3)
read从打开的文件对象中读取数据。
f=open('f/b.txt','a+')
f.seek(0) #seek是定位函数,由于我们使用了a+文件模式,导致文件操作指针永远在最后面,而最后面是没有数据的,所以我们将光标恢复到开头,这样我们就可能读取到数据了.
str=f.read() #
f.close()
print str
>>> 我是一个小小的python爱好者,我在学习python虽然学习之路艰辛
但我不放弃
复制代码
其实read函数还有几个派生方法,比如readline,就是读取一行。你可以自己尝试一下。
seek 和tell 函数
eek() 和tell() 是两个文件定位函数,其中之一是设置文件的位置和获取文件的位置(注:我们普通的文件读写函数更改文件的位置)。有时我们可能需要在特定字符串的中间插入一个字符串。这种情况下,我们就可以使用定位功能来满足我们的需求。
f=open('f/b.txt','r+')
f.seek(0) #设置光标从0开始读
str=f.read(27)
print str
f.seek(27) #设置从位置27字节开始写
f.write('哈哈哈')
f.close()
>>> 我是一个小小的python哈哈哈,我在学习python虽然学习之路艰辛
但我不放弃
复制代码
上例,我们在中间添加了‘哈哈哈’字符
删除文件
删除文件需要使用Python操作系统模块,使用时必须导入该模块。
使用OS模块卸载方法开始卸载
os.remove(filepath) #参数传我们需要删除的文件路径
复制代码
以上就是我们文件操作从创建、读写到删除的全过程。当然,由于这是一篇介绍性文章,我们只会介绍最基本的用法。然而,一切都保持不变。只有基础扎实了,才能进步。快乐向外扩张!学习的路是漫长而缓慢的!
Python异常
什么是异常
异常是程序执行过程中发生并影响程序的事件。正常运行。通常,当Python无法正确处理程序时,就会发生异常。异常是代表错误的 Python 对象。当Python脚本发生异常时,我们必须捕获并处理它,否则程序将终止执行。
当我们的程序出现错误时,编译器会通知我们该错误。然而,当我们的程序在线时,当检测到错误时程序就会崩溃。我们不能容忍这一点。目前我们需要使用异常处理。
Python 标准异常
首先看一个表格,基本上列出了我们在 Python 中遇到的所有异常(不需要一一记住,只需在脑海中过一遍即可):
Python异常处理类似于爪哇或OC。都是代码块:
try:
#可能会出现异常的代码
except Exception as e:
#出现异常的信息,这里我们可以将错误信息上传
else:
#如果没有异常发生
finally:
#这里的代码不管出不出现异常都会调用,可以用来做一些文件关闭,索引关闭的操作
复制代码
我们来做一个简单的捕获异常的例子:
f=None
try:
f = open('f/b.txt', 'r+') #这里我们打开一个f目录下的b.txt文件,其实这个文件是不存在的,应该会发生异常
except Exception as e: #这里我们使用的是异常的基类,可以先删除所有异常,毕竟有时候我们也不知道到底发生的异常是属于哪个类(当然,精确点总是更好的)
print e #我们将异常打印出来
finally:
if f:
f.close() #不管发没发生异常,我们都希望f对象存在的时候要关闭操作
>>> [Errno 2] No such file or directory: 'f/b.txt' #确实发生了文件或者目录找不到的异常
复制代码
以上是异常的常见用法。是不是很简单呢?在日常开发中,我们可能会面临很多异常处理,我们需要根据自己的需求来改变代码块,让我们的代码能够经受住任何恶劣的环境。
作者:momoxiaomming
链接:https://juejin.im/post/5a7533d05188257a792479e2版权所有来源:Nugg如需商业转载请联系作者授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。