Python(四)异常处理和文件读写

Python(四)异常处理和文件读写

异常处理

什么是错误和异常?

作为Python初学者,在刚学习Python编程时,经常会看到一些报错信息。Python有两种错误很容易辨认:语法错误和异常。

  • 异常

即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。大多数的异常都不会被程序处理,都以错误信息的形式展现。异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。

错误信息的前面部分显示了异常发生的上下文,并以调用栈的形式显示具体信息

捕捉异常可以使用try/except语句。 try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。
如果你不想在异常发生时结束你的程序,只需在try里捕获它

try:
	<statements>		#运行别的代码
except <name>:
	<statements>		#如果在try的部分发生异常,执行的语句
except <name>,<data>:
	<statements>		#如果在try的部分发生异常,获得附加的数据执行的语句
else:
	<statements>		#如果没有发生异常,执行的语句

无论try语句块中是否触发异常,都会执行finally子句中的语句块,因此一般用于关闭文件或关闭因系统错误而无法正常释放的资源。比如文件关闭,释放锁,把数据库连接返还给连接池等

try:
	normal execution block
except A:
	exception A handle
except B:
	exception B handle
except C:
	exception C handle
else:
	if no exception get here
finally:
	print('finally')
	
try:
	normal execution block
except (A,B,C) as e:		# e获取错误类型的详细信息
	exception e handle
else:
	if no exception get here
finally:
	print('finally')

以代码中,我们可以使用raise关键字来自定义异常:

raise [Exception [, args [, traceback]]]

例如:
try:
	name = input('输入变量名称:')
	if name.isdigit():
		raise NameError('bad name!')
except NameError as e:
	print(e)

总结

1.except语句不是必须的,finally语句也不是必须的,但是二者必须要有一个,否则就没有try的意义了。

2.except语句可以有多个,Python会按except语句的顺序依次匹配你指定的异常,如果异常已经处理就不会再进入后面的except语句。

3.except语句可以以元组形式同时指定多个异常,参见实例代码。

4.except语句后面如果不指定异常类型,则默认捕获所有异常,你可以通过logging或者sys模块获取当前异常。

5.如果要捕获异常后要重复抛出,请使用raise,后面不要带任何参数或信息。

6.不建议捕获并抛出同一个异常,请考虑重构你的代码。

7.不建议在不清楚逻辑的情况下捕获所有异常,有可能你隐藏了很严重的问题。

8.尽量使用内置的异常处理语句来 替换try/except语句,比如with语句,getattr()方法。

文件读写

为什么需要使用文件读写 ?

任何一种语言,文件的读写都是非常常见的。python的文件读写非常简单,仅仅一个函数open

常用打开模式:
1、r 只能读
2、r+ 可读可写,不会创建不存在的文件,从顶部开始写,会覆盖之前此位置的内容
3、w+ 可读可写,如果文件存在,则覆盖整个文件,不存在则创建
4、w 只能写,覆盖整个文件,不存在则创建
5、a 只能写,从文件底部添加内容 不存在则创建
6、a+ 可读可写 从文件顶部读取内容 从文件底部添加内容 不存在则创建
注:不建议用r+的方式去写入文件,会使之前的文件不完整。

file = open('D:\\test.txt')	#默认为r,只读模式
content = file.read()
print(content)
file.close()

使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。
    file = open('thefile.txt')
    try:
         all_the_text = file.read()
    finally:
         file.close()
注:不能把open语句放在try块里,因为当打开文件出现异常时,文件对象file无法执行close()方法。

读文件,读文本文件
    input = open('data', 'r')		#第二个参数默认为r
读二进制文件
    input = open('data', 'rb')


with open('D:\\test.txt','r+') as f,open('F:\\test.txt','r+') as d:
content = f.read()
print(content)
with open 打开文件的方式,可以不用调用close()方法

文件的读取方式

file = open('thefile.txt')			

content = file.read()				#读取所有内容
content_party = file.read(100)		#读取固定字节
content_oneline = file.readline()	#读取一行内容
content_all = file.readlines()		#读取每一行内容

前面主要是怎么读文件,那么写文件这么做呢?

1.写文本文件
        output = open('data', 'w')
2.写二进制文件
	 output = open('data', 'wb')
3.追加读文件
        output = open('data', 'w+')
4.写数据
	 file_object = open('thefile.txt', 'w')
	 file_object.write(all_the_text)
	 file_object.close( )
5.写入多行
	 file_object.writelines(list_of_text_strings)
注意,调用writelines写入多行在性能上会比使用write一次性写入要高。
读取CSV文件

逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。

CSV是一种通用的、相对简单的文件格式,被用户、商业和科学广泛应用。最广泛的应用是在程序之间转移表格数据,而这些程序本身是在不兼容的格式上进行操作的(往往是私有的和/或无规范的格式)。因为大量程序都支持某种CSV变体,至少是作为一种可选择的输入/输出格式。

特征:

  • 纯文本,使用某个字符集,比如ASCII、Unicode、EBCDIC或GB2312

  • 由记录组成(典型的是每行一条记录)

  • 每条记录被分隔符分隔为字段(典型分隔符有逗号、分号或制表符;有时分 隔符可以包括可选的空格)

  • 每条记录都有同样的字段序列。

CSV文件规则:

1 开头是不留空,以行为单位。

2 可含或不含列名,含列名则居文件第一行。

3 一行数据不跨行,无空行。

4 以半角逗号(即,)作分隔符,列为空也要表达其存在。

5 列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。

6 文件读写时引号,逗号操作规则互逆。

7 内码格式不限,可为 ASCII、Unicode 或者其他。

8 不支持特殊字符

通常CSV文件开头是不留空的,以行为单位,每行中记录一张图片的多项数据,每项数据用逗号来分割(英文逗号)。一般来说,集图用的.CSV文件格式是:
文件名,文件大小(以字节为单位),CRC校验值,注释(可省略)

如果电脑上安装了Microsoft Excel 的话 .CSV文件默认是被Excel打开的

Python操作CSV文件
读文件
	import csv
	csv_reader = csv.reader(open('D:/test.csv'))
	for row in csv_reader:
		print(row)

	import csv	#打开文件,用with打开可以不用去特意关闭file了,python3不支持file()打开文件,只能用open()
	with open('D:/test.csv', 'rb') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

写文件
   import csv
   list = ['1', '2','3','4','5']
   outfile = 'D:/test.csv'
   out = open(outfile, 'a')
   csv_writer = csv.writer(out)
   csv_writer.writerow(list)	可能遇到的问题:直接使用这种写法会导致文件每一行后面会多一个空行
   out = open(outfile, 'a', newline='')
   csv_writer = csv.writer(out)
   csv_writer.writerow(list)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值