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

Python学习系列——IO编程(八)

时间:2023-03-26 00:44:13 Python

IO是指计算机中的Input/Output,即输入和输出。在IO编程中,Stream(流)是一个很重要的概念,InputStream是输入流,OutputStream是输出流。文件读写读取文件#1.打开文件#r代表读取文件f=open("C:/Users/zhouzhaodong/Desktop/123.txt","r")#2.读取文件内容#文件打开成功,我们可以直接使用read()读取所有内容。print(f.read())#3.关闭文件#文件操作完成后,我们需要主动关闭文件,否则会占用资源。f.close()但是如果我们有时忘记关闭它怎么办?Python帮我们想到了,它引入了with语句来帮助我们调用close()方法。withopen("C:/Users/zhouzhaodong/Desktop/123.txt","r")asf:print(f.read())字符编码如果我们要读取非UTF-8的文本文档,我们你需要将编码函数传递给open()函数,才能打开对应字符编码的文件。withopen("C:/Users/zhouzhaodong/Desktop/123.txt","r",encoding="gbk")asf:print(f.read())当然我们可能想读一些非文本的内容对于文档,比如二进制文件(图片,视频...),我们不能使用r,所以我们只好使用rb模式打开。withopen("C:/Users/zhouzhaodong/Desktop/123.jpg","rb")asf:print(f.read())读取文件,当然会遇到错误,可能是非法的文件中的代码,此时我们在读取过程中会报错,open()函数会收到一个errors参数,表示我们应该如何处理错误。最直接的忽略方式:withopen("C:/Users/zhouzhaodong/Desktop/123.txt","r",errors="ignore")asf:print(f.read())writefile#1.打开文件f=open('123.txt','w')#2.写入内容f.write("HelloWorld!")#3.关闭文件f.close()我们可以重复调用write()写文件,但是操作系统不会实时写入数据,而是将数据放在内存中缓存,空闲的时候再写入。只有当我们调用close()时,操作系统才会写入所有数据。如果我们忘记调用,一些数据将会丢失。这时候我们自然而然的想到了之前的with,这里也可以使用。#w代表写入(会覆盖文件中的内容),a代表追加(不会覆盖)withopen('123.txt','w')asf:f.write("HelloWorld!")在写的时候也可以指定输入内容时的编码格式:withopen('123.txt','w',encoding='gbk')asf:f.write("HelloWorld!")StringIOandBytesIOStringIOdata读写并不一定要在文件中进行,也可以在内存中进行。fromioimportStringIO#创建一个StringIOf=StringIO()#写入内容f.write("HelloWorld!")#读取内容print(f.getvalue())BytesIOStringIO只能操作str,如果要操作二进制数据,你需要使用BytesIO。#创建一个StringIOf=BytesIO()#写入内容f.write("China".encode('utf-8'))#读取内容print(f.getvalue())运行结果:b'\xe4\xb8\xad\xe5\x9b\xbd'这里写入的字节是UTF-8编码的。可以不用bytes直接初始化一个BytesIO,然后读取。fromioimportBytesIOf=BytesIO(b'\xe4\xb8\xad\xe5\x9b\xbd')print(f.read())运行结果:b'\xe4\xb8\xad\xe5\x9b\xbd'操作文件和目录operatingsystemimportos#如果是posix,系统是linux或者MacOs,如果是nt,就是windowsprint(os.name)#如果想获取更多信息,使用uname(),注意说明这个方法不能在windows中使用#print(os.uname())运行结果:ntenvironmentvariableimportos#环境变量都存在environ变量中,也可以获取一个环境变量的值有针对性地print(os.environ.get('PATH'))操作文件和目录importos#获取当前目录的绝对路径print(os.path.abspath('.'))#如果创建一个在当前目录新建testdir文件夹,地址为:print(os.path.join('D:\\WorkSpace\\Study\\pythonTest','testdir'))#新建一个testdir文件夹os.mkdir('D:\\WorkSpace\\Study\\pythonTest\\testdir')#删除testdir文件夹os.rmdir('D:\\WorkSpace\\Study\\pythonTest\\testdir')#重命名文件:os.rename('123.txt','123.py')#删除文件:os.remove('123.py')serialization我们可以将数据序列化后存储到本地磁盘,下次启动程序时可以直接读取。importpickle#createanewdictd=dict(name='bob',age=20,score=5)#序列化对象print(pickle.dumps(d))运行结果:b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94K\x05u.'将写入数据导入文件importpickle#createanewdictd=dict(name='bob',age=20,score=5)#序列化对象print(pickle.dumps(d))#打开文件f=open('123.txt','wb')#将对象序列化为一个字节并存入文件pickle.dump(d,f)#关闭文件f.close()#打开文件f=open('123.txt','rb')#反序列化读取对象d=pickle.load(f)#关闭文件f.close()#打印反序列化文件print(d)运行结果:b'\x80\x04\x95$\x00\x00\x00\x00\x00\x00\x00}\x94(\x8c\x04name\x94\x8c\x03bob\x94\x8c\x03age\x94K\x14\x8c\x05score\x94K\x05u.'{'name':'鲍勃','年龄':20,'分数':5}