python学习_四

2020.04.30
今天是四月最后一天。学校前两天已经通知不用返校,唉,20届毕业生太难了。。。。

---------------------------------正文分割线

python中的异常捕获

和java等高级语言一样,都采用:

try
except
finally

的形式,但是在python中还可以在except后面加上else语句,当没有异常发生的时候执行else语句。
Python所有的错误都是从BaseException类派生。


python的异常捕获不像java那样,java中如果被调用函数有异常抛出语句,调用函数也需要编写异常抛出语句;而python中如果被调用函数或者创建的类可能发生异常,被调用类或函数中可以不编写异常抛出语句,而只在调用函数中抛出异常,这种特征可以明显减少异常处理语句的编写。


通过导入logging模块进行日志记录。
使用logging调试比assert好的地方在于,logging不会抛出异常。
logging可以指定记录信息的级别,具体有:
debug,info,warning,error等几个级别
使用方式如下:

logging.basicConfig(level=logging.INFO)

-此时将日志级别设置为INFO级别。


使用raise 关键字人为按照需要抛出异常。
如 raise FooErroe(“0为除数异常”)
如果raise不带参数,则会将错误异常原样抛出:

except ValueError as e:
        print('ValueError!')
        raise

-此时虽然捕获了异常,但是还是会报错。


凡是用print()来辅助查看的地方,都可以用断言(assert)来替代。

assert n!=0 ,'n is zero'

-此时如果n是0,则会抛出断言异常:

AssertionError: n is zero

启动Python解释器时可以用-O参数来关闭assert:
python -O test.py

-此时test.py中的assert语句都会失效,相当于pass。


IO操作

外存

python使用open函数打开一个文件,使用如下:

f = open = (文件路径,读写模式)

-open函数会返回一个文件对象,如果文件路径指明的文件不存在则会抛出IO异常,读写模式可以设置为’r’、'w’等。

如果打开成功,则可以使用f调用read()方法,一次性读入文件的所有内容。
通过f调用close()方法关闭数据流。合起来的操作如下:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

-通过上面的语句就可以以读取的模式打开一个文件名为file的文件,并且不管打开成不成功,f都会被关闭。

但是python还提供了另一种很简洁的方式,使用with语句来自动调用close()方法。
如下:

with open('/path/to/file''r') as f:
	//do something on f

-这个语句与前面的try…finally语句作用一样,但是更简洁。


使用open()函数打开的文件流对象取文件数据由几种方法:

f.read()   #全读取
f.read(size)   #读取size长度字符
f.readline()   #读取一行

关于文件的打开模式

如果要打开的文件是utf8编码的文本文件,那么可以直接使用’r’模式来读取,但是如果是二进制文件如图片、视频,则需要使用’rb’模式来读取

open函数还可以传入一个encoding参数,用来规定读取的文件编码形式。比如如果要读取的文件是GBK编码形式,此时传入encoding参数,并将其值设为’utf-8’,则在读入时就会先将文件转码。

但是像这种硬性指定读入形式的方式在遇到一些编码不规范的文件时就会抛出异常。此时只需要给open函数再传入一个errors参数并将其值设置为’ignore’。此时不会再抛出异常而是会直接忽略。


写文件只需要将打开模式改为’w’或者’wb’,就会写为普通文件或者二进制文件。
此时需要使用f调用write()方法,传入的参数为要写入的数据。同样可以使用with语句来简化操作。
同样也可以在open函数中传入encoding参数,只不过这时的作用是指定写入的格式。


文件写入时,如果传入的打开模式是’w’,那么在写入时会覆盖原文件。如果想要添加到原文件末尾,则使用’wa’模式。


关于传入文件路径参数。
传入路径参数时,需要在文件路径字符串前添加 r
如下:
fpath = r’C:\Windows\system.txt’


关于各个参数的搭配问题

文件路径一定是第一个参数。
打开模式一定是第二个参数。

如果是使用读入或者写入二进制即打开模式中带’b’,此时不能指定编码模式,同样也不能指定errors参数。


内存

上面的open函数用于打开存放在外存中的文件来读写。
python中还提供了一种对内存进行读写的方法:
StringIO模块

form io import StringIO

-导入StringIO模块
该模块主要用于向内存读写str对象。
使用方法和open方法差不多,但是因为是在内存中读写,所以不需要指定文件路径、编码形式以及打开模式。
只需要使用:
f = StringIO()语句创建一个StringIO对象即可。
还可以 f = StringIO(“abschsd”)创建一个已经有str对象数据的StringIO对象。
f也有write方法,没有read方法,但是有与之功能相近的方法:getvalue,该方法用于获取写入后的str对象。


StringIO也有按行读取,可以按行写入。
但是后续使用write方法写入StringIO对象时,会覆盖StringIO创建时传入的数据。
可以看出,创建时有一个读写指针,write自身也是一个单独的指针。
并且,如果使用f.readline()来读取写入到内存的str对象,只能读取到创建StringIO对象时传入的str数据,后续通过write写入的数据无法读取。
而f.getvalue()方法可以获取所有的在f对象上写入的数据,不论是通过创建时写入还是通过write方式。


对应的,python中使用BytesIO模块来对内存读写二进制数据。
操作方法与StringIO一样,但是BytesIO不然使用f.writelines()方法。
同样的,write方法会覆盖创建BytesIO对象时传入的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值