Python学习教程7:文件存储I/O流和异常捕捉

2018-09-0416:10:32后端程序开发Comments2,078 views字数 5226阅读模式

文件存储(I/O操作)

何为I/O?

I/O分别对应着英文input和output的缩写,代表着输入和输出.分别对应着我们文件的读和写的过程,文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

当我们对一个文件进行读取的操作的时候,程序会以我们要读取的文件为目标,通过输入流操作,将文字读取到缓存区,以便以后调用.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

当我们对一个文件进行写的操作的时候,程序会将我们存在缓冲区中的数据通过输出流写到我们的目标文件里.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

Python的键盘输入

python中等待键盘的函数有两个,raw_input和input,两者作用效果相同,记录键盘的输入并返回结果.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

s=raw_input('请输入任意内容:\n')

print '输出:'+s

>>>请输入任意内容:
	hello
	输出:hello
复制代码

raw_input函数返回的是一个字符串对象,我们可以直接打印出输入结果.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

s=input('请输入任意内容:\n')

print '输出:',s

>>>请输入任意内容:
	5*6
	输出: 30
复制代码

input函数返回的是一个对象,他和raw_input的根本区别是可以输入表达式,并且返回表达式的结果.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

Python文件操作

Python的文件操作都是由file对象处理.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

open函数

file object = open(file_name [, access_mode][, buffering])
复制代码

Python提供了内置函数open来获取file对象,这里我们仔细的讲解一下相关此参数的作用.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

  • 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文件代码)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

test.py文件代码,f/b文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

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函数)
复制代码

File对象相关函数

通过Python的open函数我们可以得到File对象,而文件存储的操作就是针对file对象来进行的. file对象有几个常用的函数,下面我们来一一讲解:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

close函数

close函数的作用是刷新缓冲区.并关闭file对象的操作流,此后便不能再进行读写操作了.当这个file对象再指定到新的文件对象时,file对象会先关闭以前的文件对象.所以,当我们对一个文件操作完毕之后,应当养成良好的关闭习惯,也就是调用close函数文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

f=open('f/b.txt')
f.close()
复制代码
write函数

write函数是file对象的数据写入函数,通过该函数可以将我们的字符串数据或者二进制数据写入到文件夹中.需要注意的是,如果我们需要数据换行,要另外写入换行符. 该函数需要有文件的写权限文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

f=open('f/b.txt','a+')  #这里我们制定了文件模式是读写模式(具体可参考上面的表),并且指针放在末尾

f.write('我是一个小小的python爱好者,我在学习python') 
f.write('虽然学习之路艰辛\n但我不放弃')  #注意这里我们中间加了一个换行符
f.close()  #操作完毕关闭对象
复制代码

执行以上代码之后,你可以去相关目录打开b.txt文件查看内容:(但我不放弃这句因为换行单独成一行了)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

我是一个小小的python爱好者,我在学习python虽然学习之路艰辛
但我不放弃
复制代码
read函数
f.read(n)  #参数n表示读取的文件长度,这里的长度是字节长度,参数不填的时候默认为默认缓冲区大小,上面我们打印过,是8192个字节长度
复制代码

Tips:一个gbk编码的汉字占二个字节,一个utf-8编码的汉字占三个字节.(所以要想输出一个完整的utf-8的字符,最少长度要为3)文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

read是从一个打开的文件对象中读取数据.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

f=open('f/b.txt','a+')
f.seek(0)    #seek是定位函数,由于我们使用了a+文件模式,导致文件操作指针永远在最后面,而最后面是没有数据的,所以我们将光标恢复到开头,这样我们就可能读取到数据了.
str=f.read()  #
f.close()
print str

>>> 我是一个小小的python爱好者,我在学习python虽然学习之路艰辛
	但我不放弃
复制代码

其实read函数还有几个衍生的方法,比如readline,读取一行,大家可以自己试试.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

seek和tell函数

seek()和tell()是两个文件定位函数,一个是设置文件的操作位置,一个是获取文件的操作位置(注意:我们平常的文件读写操作都是会改变文件的操作位置的),有时候我们可能需要在某一段字符串的中间插入一端字符串,这时我们就可以利用定位函数来达到我们的需求.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

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虽然学习之路艰辛
	但我不放弃
复制代码

上面的例子中,我们直接在中间插入了'哈哈哈'字符文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

文件删除

文件删除我们需要用到python的os模块,使用时需要导入该模块.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

使用os模块的remove方法开始删除文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

os.remove(filepath)    #参数传我们需要删除的文件路径
复制代码

以上就是我们文件操作,从创建,读写,到删除的整个过程,当然我们因为是入门篇,只是介绍了最基本的用法,不过万事不变其宗,基础牢固了,我们才能更好的向外拓展!学习之路慢慢其修远兮!文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

Python异常

什么是异常

异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。 一般情况下,在Python无法正常处理程序时就会发生一个异常。 异常是Python对象,表示一个错误。 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

当我们的程序出现错误的时候,编译器都会告诉我们错误的地方,可是当我们程序上线之后,一旦遇到错误,程序便会宕机,这是我们不能容忍的,这时候就需要用到异常处理了.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

python标准异常

首先我们来看个表,里面基本罗列了python中我们所有会遇到的异常(不用一一记住,脑袋过一遍就可以了):文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

异常名称异常描述
BaseException所有异常的基类
SystemExit解释器请求退出
KeyboardInterrupt用户中断执行(通常是输入^C)
Exception常规错误的基类
StopIteration迭代器没有更多的值
GeneratorExit生成器(generator)发生异常来通知退出
StandardError所有的内建标准异常的基类
ArithmeticError所有数值计算错误的基类
FloatingPointError浮点计算错误
OverflowError数值运算超出最大限制
ZeroDivisionError除(或取模)零 (所有数据类型)
AssertionError断言语句失败
AttributeError对象没有这个属性
EOFError没有内建输入,到达EOF 标记
EnvironmentError操作系统错误的基类
IOError输入/输出操作失败
OSError操作系统错误
WindowsError系统调用失败
ImportError导入模块/对象失败
LookupError无效数据查询的基类
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
MemoryError内存溢出错误(对于Python 解释器不是致命的)
NameError未声明/初始化对象 (没有属性)
UnboundLocalError访问未初始化的本地变量
ReferenceError弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError一般的运行时错误
NotImplementedError尚未实现的方法
SyntaxErrorPython 语法错误
IndentationError缩进错误
TabErrorTab 和空格混用
SystemError一般的解释器系统错误
TypeError对类型无效的操作
ValueError传入无效的参数
UnicodeErrorUnicode 相关的错误
UnicodeDecodeErrorUnicode 解码时的错误
UnicodeEncodeErrorUnicode 编码时错误
UnicodeTranslateErrorUnicode 转换时错误
Warning警告的基类
DeprecationWarning关于被弃用的特征的警告
FutureWarning关于构造将来语义会有改变的警告
OverflowWarning旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning关于特性将会被废弃的警告
RuntimeWarning可疑的运行时行为(runtime behavior)的警告
SyntaxWarning可疑的语法的警告
UserWarning用户代码生成的警告

异常的捕捉和处理

python中的异常捕捉处理和java或者oc差不多.都是一个代码块:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

try:
	#可能会出现异常的代码
except Exception as e:
	#出现异常的信息,这里我们可以将错误信息上传
else:
	#如果没有异常发生
finally:
	#这里的代码不管出不出现异常都会调用,可以用来做一些文件关闭,索引关闭的操作
复制代码

我们来做个简单的异常捕捉的例子:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

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'   #确实发生了文件或者目录找不到的异常
复制代码

以上就是异常的的常用用法,是不是很简单,日常开发中,我们可能会遇到很多异常处理,我们需要根据自己的需求对代码块进行更改,以便以我们的代码可以抗拒任何恶劣的环境.文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

作者:momoxiaomming
链接:https://juejin.im/post/5a7533d05188257a792479e2
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/bc/4425.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/bc/4425.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定