当前位置: 首页 > 后端技术 > Python

Python基础:Python中IO

时间:2023-03-26 14:22:19 Python

介绍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):文件“”,第1行,在ValueError中:对已关闭文件的I/O操作。文件对象的方法获取到文件对象后,我们就可以调用文件中的方法了。f.read(size)将读取一些数据并将其作为字符串(在文本模式下)或字节对象(在二进制模式下)返回。size是一个可选的数字参数。当size省略或为负数时,读取并返回整个文件的内容;否则,最多读取并返回size个字符(在文本模式下)或size个字节(在二进制模式下))。如果已到达文件末尾,f.read()将返回一个空字符串('')。>>>f.read()'这是整个文件。\n'>>>f.read()''f.readline()从文件中读取一行;换行符(\n)保留在字符串中如果文件不以换行符结尾,则在文件的最后一行省略。如果f.readline()返回一个空字符串,表示已经到达文件末尾,一个空行用'\n'表示,它只包含一个换行符。>>>f.readline()'这是文件的第一行\n'>>>f.readline()'文件的第二行\n'>>>f.readline()''有还有一种更简单的读取方式是从文件中遍历:>>>forlineinf:...print(line,end='')...Thisisthefirstlineofthefile.Secondlineofthefilefile如果你想把文件中的所有行作为一个列表来读取,你也可以使用list(f)或f.readlines()。f.write(string)将字符串的内容写入文件并返回写入的字符数。>>>f.write('Thisisatest\n')15如果是文本模式,在写入文件之前,需要将对象转换成文本形式,我们可以使用str()来转换。>>>value=('theanswer',42)>>>s=str(value)#将元组转换为字符串>>>f.write(s)18使用f.seek(offset,whence)定位file指针的位置,然后后续的读操作都会从这个位置开始。值为0表示从文件开头开始计数,1使用当前文件位置,2使用文件末尾作为参考点。whence如果省略则默认为0,它使用文件的开头作为参考点。>>>f=open('workfile','rb+')>>>f.write(b'0123456789abcdef')16>>>f.seek(5)#转到文件中的第6个字节5>>>f.read(1)b'5'>>>f.seek(-3,2)#转到end13之前的第3个字节>>>f.read(1)b'd'使用jsonJSON是一个很方便的A用于信息交换的文件格式。让我们看看如何使用JSON将对象转换为字符串:>>>importjson>>>json.dumps([1,'simple','list'])'[1,"simple","list"]'dumps是转换为jsonstr的对象。JSON还有一个dump方法,可以直接将对象存储到文件中。json.dump(x,f)从文件中解析出json字符串,可以使用load:x=json.load(f)JSON中的键值对中的键总是str类型。当一个对象被转换为JSON时,字典中的所有键都被强制转换为字符串。这样做的结果是字典转换为JSON并返回字典可能与原始字典不同。换句话说,如果x的键不是字符串,则loads(dumps(x))!=x。本文已收录于http://www.flydean.com/08-python-io/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等着你去探索!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!