Code前端首页关于Code前端联系我们

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

terry 2年前 (2023-09-25) 阅读数 46 #后端开发

文件存储(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 中遇到的所有异常(不需要一一记住,只需在脑海中过一遍即可):

异常名称 解释 BaseException 所有异常基类 Systemsxit 解释器要求退出 异常 S顶级基类Iterator 没有更多值​​GeneratorExit退出时发生生成器异常通知 FloatingPointError浮点计算错误OverflowError数值函数溢出最大限制ZeroDivisionError除(或取模)于零或erer 争论失败 AttributeError对象没有此属性 EOFError无内置输入,已达到 EOF 标记 EnvironmentError操作系统错误基类IOError输入/打印功能失败OSError操作系统错误❙s导入错误导入模块/对象失败搜索错误无效的查询基类IndexError没有这样的索引键错误键不存在错误❀ror内存不足错误(对Python来说不​​是致命的)解释器)NameError未声明/初始化对象(无属性)UnboundLocalError使用未初始化的局部变量❙❙弱引用(弱引用)尝试访问已废弃的对象RuntimeError一般运行时错误NotImplementedError未实现的方法语法错误♺语法错误❀ IndentationError 缩进错误TabErrorTab 与空格混合系统错误通用解释器系统错误 TypeError类型 ♺ 中的函数不正确 输入的参数无效 UnicodeErrorUnicode 相关错误 UnicodeDecodeError解码时出现 Unicode 错误En代码错误编码时出现 Unicode 错误Unicode 错误❙❙ 转换错误 警告 基本警告类别 弃用警告 有关弃用功能的警告 FutureWarning 有关其语义结构的警告可能未来变化溢出警告❀警告❀关于旧的延长警告ko功能将停用RuntimeWarning关于可疑运行时行为的警告语法警告关于可疑语法的警告用户警告由userwarning创建代码概念警告

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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门