《Python手册》doc版.doc_第1页
《Python手册》doc版.doc_第2页
《Python手册》doc版.doc_第3页
《Python手册》doc版.doc_第4页
《Python手册》doc版.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6. 输入输出6.1 设计输出格式输出值的方法:表达式语句、print语句和write()方法。想要对输入字符串格式做一些复杂的控制,有两种方法。第一,控制整个字符串,使用字符切割和联接操作创建任意输出形式。第二,使用%操作符和字符串作为左参数。%操作符将左参数解释为类似于sprintf()风格的格式字符串,并作用于右参数,从操作中返回格式化的字符串。Python中可以使用repr()或str()函数,将值转为字符串。反引号()等价于repr()。这些函数在未来的Python版本中将会被去掉。函数str()用于将值转化为适于人阅读的形式,而repr()转化为共解释器读取的形式(如果没有等价的语法,则会发生SyntaxError异常)。某对象没有适于人阅读的解释形式时,str()会返回与repr()等同的值。数值、链表、字典对各函数有统一的解读方式。字符串和浮点数,有独特的解读方式。示例: s= Hello World! str(s)Hello World! repr(s)Hello World! str(0.1)0.1 repr(0.1)0.10000000000000001 hello = hello worldn print hellohello world print repr(hello)hello worldn print str(hello)hello world x = 10*3.25 y = 200*200 x, y, (spam,eggs)x, y, (spam,eggs) 一个输出平方和立方的例子: for x in range(1, 11):. print repr(x).rjust(2), repr(x*x).rjust(3),. print repr(x*x*x).rjust(4). 1 1 1 2 4 8 3 9 27 4 16 64 5 25 125 6 36 216 7 49 343 8 64 512 9 81 72910 100 1000 print方法总会在两个参数之间增加一个空格。rjust()函数参数为输出所占的位数,输出方式为右对齐。类似的函数有ljust()和center()。这些函数只是输出新的字符串,并不改变它们,如果输出的字符串太长,也不会被截断,而是原样输出。如果要截断字符串,可以使用切割操作,如,x.ljust(n):n。zfill()用于向数值的字符串表达左侧填充0。该函数可以正确理解正负号。 12.zfill(5)00012 -3.14.zfill(7)-003.14 3zfill(5)3%操作符使用方法 import math print The value of PI is approximately %5.3f. % math.piThe value of PI is approximately 3.142. 如果有超过一个的字符串要格式化为一体,就需要将它们传入一个元组做为右值: table = A:001, B:002, C:003 for name, phone in table.items():. print %-10s = %10d % (name, phone). A = 1C = 3B = 2 大多数类C的格式化操作都需要传入适当的类型。使用%s格式会更轻松一些:如果对应的参数不是字符串,它会通过内置的str()函数转化为字符串。Python支持用*作为一个隔离参数来传递宽度或精度。Python不支持C的%n和%p操作符。变量格式化通过名字而不是位置,这样可以产生符合真实长度的格式化字符串,而不用分隔。这一效果可以通过使用form % (name) format结构来实现: table = A:001, B:002, C:003 print A:%(A)d; B:%(B)d; C:%(C)d % tableA:1; B:2; C:3 这个技巧在新的内置函数vars()组合使用时非常有用,该函数返回一个包含所有局部变量的字典。6.2 读写文件open()返回一个文件,通过的用法需要两个参数:open(filename, mode) f = open(C:/Users/cym/Desktop/1.txt, w) print f mode有:r,此选项使文件只读,默认模式;w,此选项使文件只写,对于已经存在的同名文件,该操作覆盖源文件;a,此选项以追加方式打开文件;r+,此选项以读写方式打开文件。在Windows和Moc平台,b模式以二进制方式打开文件,所以会有rb,wb,r+b等等组合。Windows平台上文本文件与二进制文件是有区别的,读写文本文件时,行尾会自动添加行结束符。这种后台操作方式对ASCII文本文件没有什么问题,但是操作JPEG或EXE这样的二进制文件就会产生破坏。在操作这些文件时一定要记得以二进制模式打开。6.2.1 文件对象方法读文件,f.read(size)。该方法读取若干数量的数据并以字符串形式返回其内容,字符串长度为数值size所指定的大小。如果没有指定size或者指定为负数,就会读取并返回整个文件。当文件大小为当前机器内存两倍时,就会产生问题。正常情况下,会尽可能按比较大的size读取和返回数据。如果到了文件末尾,f.read()会返回一个空字符串。 f = open(C:/Users/cym/Desktop/1.txt, r) f.read() f.readline()从文件中读取单独一行,字符串结尾会自动加上一个换行符,只有当文件最后一行没有以换行符结尾时,这一操作才会被忽略。如果f.readline()返回一个空字符串,那就表示到达了文件末尾,如果是一个空行,就会描述为n,一个只包含换行符的字符串。f.readlines(size)返回一个列表,包含了文件中所有的数据行。如果给定了size参数,就会读入多于一行的比特数,从中返回多行文本。这个功能通常用于高效读取大型行文本,避免了将整个文件读入内存。这种操作只返回完整的行。一种另外的方法是循环读取文件。这是一种内存效率高,速度快,代码简单的方法: for line in f:. print line,. 交换通道很简单,但是不提供完整的控制。因为两个通道管理线缓冲不同,它们不能混合。如果需要写入字符串以外的数据,就要先把这些数据转换为字符串。 f = open(C:UserscymDesktoptest.txt,r+) value = (the answer, 42) s = str(value) f.write(s) f.close() f.tell()返回一个整数,代表文件对象在文件中的指针位置,该数值计量了自文件开头到指针处的比特数。需要改变文件对象指针的话,使用f.seek(offset, from_what)。指针在该操作中从指定的引用位置移动offset比特,引用位置由from_what参数指定。from_what值为0表示自文件起处开始,1表示自当前文件指针位置开始,2表示自文件末尾开始。from_what可以忽略,其默认值为0,此时从文件头开始。文件使用完后,调用f.close()可以关闭文件,释放打开文件后占用的系统资源。调用f.close()之后,再调用文件对象会自动引发错误。文件对象还有一些不太常用的附加方法,比如isatty()和truncate()。6.2.2 pickle模块我们可以很容易的读写文件中的字符串。数值就要多费点周折,因为read()方法只会返回字符串,应该将其传入int()方法中,就可以将123这样的字符串转为对应的数值123。不过,当你需要保存更为复杂的数据类型,例如链表、字典,类的实例,事情就会变的更复杂了。Python提供了一个名为pickle的标准模块。这是一个令人赞叹的模块,几乎可以把任何Python对象表达为字符串,这一过程称之为封装。从字符串表达出重新构造对象之为拆封unpickling。封装状态中的对象可以存储在文件或对象中,也以通过网络在远程的机器之间传输。如果你有一个对象x,一个以写模式打开的文件对象f,封装对象的最简单的方法只需要一行代码:pickle.dump(x,f)如果f是一个以读模式打开的文件对象,就可以重装拆封这个对象:x=pickle.load(f)pickle是存储Python对象以供其它程序或其本身以后调用的标准方法。提供这一组技术的一个持久化对象。因为pickle的用途很广泛,很多Python扩展的作者都非常注意类似矩阵这样的新数据类型是否适合封装和拆封。7. 错误和异常7.1 语法错误语法错误,也称作解析错误。解析器会重复出错的行,并在行中最早发现的错误位置上显示一个小箭头,错误就发生在箭头指向的位置。7.2 异常即使是在语法上完全正确的语句,尝试执行它的时候,也有可能会发生错误。在程序运行中检测出的错误称之为异常,它通常不会导致致命的问题。大多数异常不会由程序处理,而是显示一个错误信息: 10 * (1/0)Traceback (most recent call last): File , line 1, in ZeroDivisionError: integer division or modulo by zero 4 + spam*3Traceback (most recent call last): File , line 1, in NameError: name spam is not defined 2 + 2Traceback (most recent call last): File , line 1, in TypeError: cannot concatenate str and int objects 错误信息的最后一行指出发生了什么错误。异常也有不同的类型,异常类型作为错误信息的一部分显示出来:示例中的异常分别为零除错误(ZeroDivisionError),命名错误(NameError)和类型错误(TypeError)。打印错误信息时,异常的类型作为异常的内置名显示。对于所有的内置异常都是如此,不过用户自定义异常就不一定了。标准异常名是内置的标识。这一行后一部分是关于该异常类型的详细说明,这意味着它的内容依赖于异常类型。错误信息的前半部分以堆栈的形式列出异常发生的位置。通常在堆栈中列出了源代码行,然而,来自标准输入的源码不会显示出来。7.3 处理异常通过编程可以处理指定的异常。以下的例子重复要求用户输入一个值,直到用户输入的是一个合法的整数为止。不过这个程序允许用户中断程序。需要注意的是用户发出的中断会引发一个KeyboardInterrupt异常。try语句按如下方式工作:首先,执行try子句(在try和except关键字之间的部分)。如果没有异常发生,except子句在try语句执行完毕后就被忽略。如果在try子句执行过程中发生了异常,那么该子句其余的部分就会被忽略。如果异常匹配于except关键字后面指定的异常类型,就执行对应的except子句,忽略try子句的其他部分。然后继续执行try语句之后的代码。如果发生了一个异常,在except子句中没有与之匹配的分支,它就会传递到上一级try语句中。如果最终仍找不到对应的处理语句,它就成为一个未处理异常,终止程序运行,显示提示信息。一个try语句可能包含多个except子句,分别指定处理不同的异常。至多只会有一个分支被执行。异常处理程序只会处理对应的try子句中发生的异常,在同一个try语句中,其他子句中发生的异常则不作处理。一个except子句可以在括号中列出多个异常的名字,例如:. except (RuntimeError, TypeError, NameError):. pass最后一个except子句可以省略异常名,把它当做一个通配项使用。一定要慎用这种方法,因为 它很可能会屏蔽掉真正的程序错误,使人无法发现!它也可以用于打印一行错误信息,然后重新抛出异常(可以使调用者更好的处理异常)。import systry: f = open(myfile.txt) s = f.readline() i = int(s.strip()except IOError as (errno, strerror): print I/O error(0): 1.format(errno, strerror)except ValueError: print Could not convert data to an integer.except: print Unexpected error:, sys.exc_info()0 raisetryexcept语句可以带有一个else子句,该子句只能出现在所有except子句之后。当try语句没有抛出异常时,需要执行一些代码,可以使用这个子句。例如:for arg in sys.argv1: try: f = open(arg, r) except IOError: print cannot open, arg else: print arg, has, len(f.readlines(), lines f.close()使用else子句比在try子句中附加代码要好,因为这样可以避免trycatch意外的截获本来不属于它们保护的那些代码抛出的异常。发生异常时,可能会有一个附属值,作为异常的参数存在。这个参数是否存在、是什么类型,依赖于异常的类型。在异常名(或元组)之后,也可以为except子句指定一个变量。这个变量绑定于一个异常实例,它存储在instance.args的参数中。为了方便起见,异常实例定义了_getitem_和_str_,这样就可以直接访问打印参数而不必引用.args。这种做法不推荐。替代的更好做法是给异常传递一个参数(如果要传递多个参数,可以传递一个元组),把它绑定到message属性。一旦异常发生,它会在抛出前绑定所有指定的属性。try:. raise Exception(spam, eggs).except Exception as inst:. print type(inst) # the exception instance. print inst.args # arguments stored in .args. print inst # _str_ allows args to printed directly. x, y = inst # _getitem_ allows args to be unpacked directly. print x =, x. print y =, y.(spam, eggs)(spam, eggs)x = spamy = eggs对于未处理的异常,如果它有一根参数,那就会作为错误信息的最后一部分(“明细”)打印出来。异常处理句柄不只是可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论