Python IO编程
一:IO编程分类与理解
由于CPU和内存的速度远远高于外设的速度,所以,在IO编程中,就存在速度严重不匹配的问题。举个例子来说,比如要把100M的数据写入磁盘,CPU输出100M的数据只需要0.01秒,可是磁盘要接收这100M数据可能需要10秒,怎么办呢?有两种办法:
第一种是CPU等着,也就是程序暂停执行后续代码,等100M的数据在10秒后写入磁盘,再接着往下执行,这种模式称为同步IO;
另一种方法是CPU不等待,只是告诉磁盘,“您老慢慢写,不着急,我接着干别的事去了”,于是,后续代码可以立刻接着执行,这种模式称为异步IO。
同步和异步的区别就在于是否等待IO执行的结果。好比你去麦当劳点餐,你说“来个汉堡”,服务员告诉你,对不起,汉堡要现做,需要等5分钟,于是你站在收银台前面等了5分钟,拿到汉堡再去逛商场,这是同步IO。
你说“来个汉堡”,服务员告诉你,汉堡需要等5分钟,你可以先去逛商场,等做好了,我们再通知你,这样你可以立刻去干别的事情(逛商场),这是异步IO。
二 文件读写
见《Python编程-从入门到实践》第十章
三 内存中读写
StringIO顾名思义就是在内存中读写str。
要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:
>>> from io import StringIO >>> f = StringIO() >>> f.write('hello') 5 >>> f.write(' ') 1 >>> f.write('world!') 6 >>> print(f.getvalue()) hello world!
getvalue()
方法用于获得写入后的str。
要读取StringIO,可以用一个str初始化StringIO,然后,像读文件一样读取:
>>> from io import StringIO >>> f = StringIO('Hello!\nHi!\nGoodbye!') >>> while True: ... s = f.readline() ... if s == '': ... break ... print(s.strip()) ... Hello! Hi! Goodbye!
五 操作文件和目录
1 操作文件和目录的函数一部分放在os
模块中,一部分放在os.path
模块中,这一点要注意一下。查看、创建和删除目录可以这么调用:
查看当前目录的绝对路径: >>> os.path.abspath('.') '/Users/michael' # 在某个目录下创建一个新目录,首先把新目录的完整路径表示出来: >>> os.path.join('/Users/michael', 'testdir') '/Users/michael/testdir' # 然后创建一个目录: >>> os.mkdir('/Users/michael/testdir') # 删掉一个目录: >>> os.rmdir('/Users/michael/testdir')
2 要拆分路径时,也不要直接去拆字符串,而要通过os.path.split()
函数,这样可以把一个路径拆分为两部分,后一部分总是最后级别的目录或文件名:
>>> os.path.split('/Users/michael/testdir/file.txt') ('/Users/michael/testdir', 'file.txt')
3 os.path.splitext()
可以直接让你得到文件扩展名,很多时候非常方便
>>> os.path.splitext('/path/to/file.txt') ('/path/to/file', '.txt')
4
# 对文件重命名: >>> os.rename('test.txt', 'test.py') # 删掉文件: >>> os.remove('test.py')
5
os.listdir()用于返回一个由文件名和目录名组成的列表,其参数是一个绝对路径
os.path.isdir()用于判断对象是否为一个目录
os.path.isfile()用于判断对象是否为一个文件
下行代码可以返回文件目录中所有python文件
[x for x in os.listdir(文件完整目录) if os.path.isfile(x) and os.path.splitext(x)[1]=='.py']
编写一个程序,能在给定目录以及给定目录的所有子目录下查找文件名包含指定字符串的文件,并打印出相对路径。
import os def GetFileAbsPath(name,path): if not isinstance(name,str): raise TypeError if not isinstance(path,str): raise TypeError for x in os.listdir(path): abspath=os.path.join(path,x) if os.path.isfile(abspath) and name in x: print(abspath) if os.path.isdir(abspath): GetFileAbsPath(name,abspath) name=input('请输入您想找的字符串:') path=input('请输入完整路径:') GetFileAbsPath(name,path)
六 关于json的内容,查看《python编程从入门到实践》8.4章节