介绍IO是输入和输出。任何程序如果要与外界进行交互,都需要用到IO。与java相比,Python中的IO更加简单易用。本文将详细介绍Python中的IO操作。Linux输入输出Linux中有三种标准输入输出,分别是STDIN、STDOUT、STDERR,对应的数字分别为0、1、2。STDIN为标准输入,默认从键盘读取信息;STDOUT为标准输出,默认将输出输出到终端;STDERR是标准错误,默认将输出输出到终端。我们常用的2>&1指的是指定标准输出和标准错误为同一个输出路径。格式化输出在python中,我们可以使用print方法来输出信息。我们看一下print函数的定义:print(*objects,sep='',end='\n',file=sys.stdout,flush=False)print函数将对象打印到file指定的文本流中,由sep分隔并在末尾添加end。sep、end、file和flush(如果存在)必须作为关键字参数给出。所有非关键字参数都被转换为字符串并写入流,由sep分隔并附加end。sep和end都必须是字符串;它们也可以是None,这意味着使用默认值。如果没有给出对象,print()将只写结束。文件参数必须是具有write(string)方法的对象;如果参数不存在或没有,将使用sys.stdout。print()不能与二进制模式下的文件对象一起使用,因为要打印的参数已转换为文本字符串。对于这些对象,可以使用file.write(...)。输出是否被缓存通常由文件决定,但如果flush关键字参数为真,输出流将被强制刷新。可以看到print的输出格式比较简单。让我们看看如何丰富输出格式。f格式化如果要格式化一个字符串,可以在字符串的左引号前加上f或F。这样我们就可以直接在字符串中引入变量值,只需要把变量放在{和}之间即可。>>>year=2016>>>event='Referendum'>>>f'Resultsofthe{year}{event}''Resultsofthe2016Referendum'除了把Python变量放在{}中,还可以把里面的一个函数:>>>importmath>>>print(f'pi的值大约是{math.pi:.3f}.')pi的值大约是3.142。传递一个整数使该字段成为最小字符宽度。方便的列对齐:>>>table={'Sjoerd':4127,'Jack':4098,'Dcab':7678}>>>forname,phoneintable.items():...print(f'{name:10}==>{phone:10d}')...Sjoerd==>4127Jack==>4098Dcab==>7678{}变量后面也可以跟转换符号:'!a'表示应用ofascii(),'!s'表示使用str(),'!r'表示使用repr():>>>animals='eels'>>>print(f'我的气垫船满是{animals}.')Myhovercraftisfullofeels.>>>print(f'Myhovercraftisfullof{animals!r}.')Myhovercraftisfullof'eels'.format除此之外,str本身还自带一个强大的格式化函数:str.format(*args,**kwargs)调用该方法的字符串可以包含字符串字面值或用花括号{}括起来的替换字段,每个替换字段可以包含一个位置参数一个数字索引,或关键字参数的名称。返回的字符串副本中的每个替换字段将替换为相应参数的字符串值。>>>"1+2的总和是{0}".format(1+2)'1+2的总和是3'让我们看另一个使用索引的例子:>>>print('{0}and{1}'.format('spam','eggs'))spamandeggs>>>print('{1}and{0}'.format('spam','eggs'))eggsandspam看一个关键字示例:>>>print('This{food}is{adjective}.'.format(...food='spam',adjective='absolutelyhorrior'))这个垃圾邮件绝对可怕。再看一个组合示例:>>>print('{0},{1},and{other}的故事.'.format('Bill','Manfred',other='Georg'))Thestory比尔、曼弗雷德和乔治。还有非常复杂的组合示例:>>>table={'Sjoerd':4127,'Jack':4098,'Dcab':8637678}>>>print('Jack:{0[Jack]:d};Sjoerd:{0[Sjoerd]:d};'...'Dcab:{0[Dcab]:d}'.format(table))Jack:4098;舍尔德:4127;Dcab:8637678或使用“**”表示法将表作为关键字参数传递:>>>table={'Sjoerd':4127,'Jack':4098,'Dcab':8637678}>>>print('Jack:{Jack:d};Sjoerd:{Sjoerd:d};D驾驶室:{Dcab:d}'.format(**table))Jack:4098;舍尔德:4127;Dcab:8637678您还可以使用n类型“{:n}”来格式化数字:>>>yes_votes=42_572_654>>>no_votes=43_132_495>>>percentage=yes_votes/(yes_votes+no_votes)>>>'{:-9}YESvotes{:2.2%}'.format(yes_votes,percentage)'42572654YESvotes49.67%'repr和str如果我们只想将一个Python对象转换为字符串,我们可以使用repr()或str(),str()函数用于返回人类可读值的表示,repr()用于生成机器可读的解释表示例如:>>>s='Hello,world.'>>>str(s)'你好,世界。'>>>repr(s)"'你好,世界。'">>>str(1/7)'0.14285714285714285'>>>x=10*3.25>>>y=200*200>>>s='Thex的值为'+repr(x)+',y为'+repr(y)+'...'>>>print(s)x的值为32.5,y为40000...>>>#字符串的repr()添加字符串引号和反斜杠:...hello='hello,world\n'>>>hellos=repr(hello)>>>print(hellos)'hello,world\n'>>>#repr()的参数可以是任何Python对象:...repr((x,y,('spam','eggs')))"(32.5,40000,('spam','eggs'))"str对象还提供了一些手动格式化字符串的方法:>>forxinrange(1,11):...print(repr(x).rjust(2),repr(x*x).rjust(3),end='')...#注意在前一行使用了'end'...print(repr(x*x*x).rjust(4))...111248392741664525125636216749343864512981729101001000个字符串对象的str.rjust()方法通过在左侧填充空格来右对齐给定宽度的字段中的字符串。类似的方法还有str.ljust()和str.center()。如果输入字符串太长,他们不会截断字符串而是按原样返回。如果你想保证字符串的长度,你可以使用切片:x.ljust(n)[:n]。您还可以使用str.zfill()将字符串填充为0:>>>'12'.zfill(5)'00012'>>>'-3.14'.zfill(7)'-003.14'>>>'3.14159265359'.zfill(5)'3.14159265359'%格式化方法%也可用于格式化字符串,给定'string'%值,字符串中的%实例将被替换为零个或多个值元素。此操作通常称为字符串插值。>>>importmath>>>print('pi的值大约是%5.3f.'%math.pi)pi的值大约是3.142。读写文件python读写文件很简单,使用open()方法。open()返回一个文件对象。我们看一下它的定义:open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)第一个参数是文件名.第二个参数是文件打开的模式,可用的模式有:charactermeaning'r'read(default)'w'write,andtruncatethefilefirst'x'createexclusively,failiffilealreadyexists'a'写入,如果文件存在则追加'b'二进制模式't'文本模式(默认)'+'打开以进行更新(读取和写入)默认模式为'r'。看一个打开文件的例子:>>>f=open('workfile','w')文件打开自然要关闭,所以我们需要显式调用f.close()方法:>>>f.close()java中有类似trywithresource的文件自动关闭功能吗?我们可以使用with,这样文件用完后会自动关闭,非常好用。>>>withopen('workfile')asf:...read_data=f.read()>>>#我们可以检查文件是否已自动关闭。>>>f.closedTrue文件关闭后,如果想再次读取,会报错:>>>f.close()>>>f.read()Traceback(mostrecentcalllast):文件“
