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

【Python教程】07.系统与命令

时间:2023-03-26 13:08:54 Python

大纲系统模块交互式命令行打包与配置实践系统模块Python系统模块主要包括os和sys模块,都是很常用的模块,基本都是导入的。模块导入:importosimportsys系统常量:获取当前系统的相关信息。1.当前系统:sys.platform。print(sys.platform)输出:Python是一种跨平台语言,也就是说在windows上开发的代码也可以在linux和macos上运行。在其他平台上开发的语言也可以在Windows上运行。但是在实际编写跨平台程序的时候,难免会遇到针对不同平台的不同解决方案。这时候就需要获取当前系统,将不同平台的代码分开。2.Python环境变量:sys.version、sys.executable、sys.path。print(sys.version.split()[0])#获取Python版本print(sys.executable)#获取Python的执行文件print(sys.path)#获取Python代码的所有目录输出:获取版本时Python的数量,一般只需要取第一条内容即可。可用于不同版本的处理。Python执行文件就是使用的python,结果也验证了我们使用的是venv虚拟环境。Path目录是所有Python代码所在的目录,运行时会在这些目录下找到模块。这个列表包括了我们的开发目录,Python自带的包目录,还有第三方的包目录。3、跨平台符号:os.linesep、os.sep、os.pathsep。print(os.linesep)#换行符,Unix是\n,Win32是\r\nprint(os.sep)#文件路径分隔符,Unix是/,Win32是\print(os.pathsep)#多个文件路径之间的分隔符,Unix是:,Win32是;当遇到需要编写运行在不同平台上的代码时,这些符号最好使用这些常量。4.其他不重要的:sys.maxsize、sys.winver、os.curdir、os.pardir、os.copyright等。print(sys.maxsize)#整数最大值9223372036854775807print(sys.winver)#主版本号3.6print(os.curdir)#当前目录.print(os.pardir)#上层目录..print(sys.copyright)#版权信息os模块的一个重要功能是对文件目录进行操作。我们先了解一下文件路径操作。文件路径操作:os.path[os的子模块],包含各种处理文件和文件名的方法。1、几个常量:os.path.sep、os.path.pathsep、os.path.extsep。print(os.path.sep)#路径分隔符(Unix是/,Win是\\)print(os.path.pathsep)#多个路径之间的分隔符,多用于环境变量(Unix是:,Win是;)print(os.path.extsep)#后缀名符号一般为.它类似于os模块。2.路径组合:os.path.join。path=os.path.join('newdir','python.txt')output:join参数为不确定参数,可以无限填,print方法同理。join将使用系统的定界符将所有参数组合到一个路径中。3、路径分割:os.path.split、os.path.dirname、os.path.basename、os.path.splitext。_dir,_file=os.path.split(path)#拆分为目录和文件print(_dir)#目录print(_file)#文件print(os.path.dirname(path))#与_dir相同print(os.path.basename(path))#与_file的输出相同:split方法将路径分解为两个目录和文件。这个文件也可以是最后一级目录。或者,您可以使用dirname和basename方法分别获取目录和文件。_filename,_ext=os.path.splitext(_file)#文件名和扩展名print(_filename,_ext)output:splitext用于分解扩展名,这也是一种很常用的方法。4、路径变换:os.path.relpath、os.path.abspath、os.path.commonprefix。print(os.path.relpath(path))#获取相对于当前路径的路径print(os.path.abspath(path))#绝对路径输出:relpath将路径转换为基于当前目录的相对路径。abspath将路径转换为绝对路径。f1='newdir/py/file.txt'f2='newdir/py/l1/file.txt'f3='newdir/py/l2/file.txt'print(os.path.commonprefix([f1,f2,f3]))output:commonprefix可以得到的几个路径的公共前缀[inputlist]。5.判断路径是否存在:os.path.exists、os.path.isdir、os.path.isfile。print(os.path.exists(path))#判断是否存在print(os.path.isdir(path))#判断文件夹是否存在print(os.path.isfile(path))#判断文件是否存在,isdir存在并且是一个文件夹,isfile存在并且是一个文件。6、文件属性:os.path.getatime、os.path.getmtime、os.path.getctime、os.path.getsize。print(os.path.getatime('./os1.py'))#访问时间print(os.path.getmtime('./os1.py'))#修改时间print(os.path.getctime('./os1.py'))#创建时间print(os.path.getsize('./os1.py'))#文件大小文件必须存在,否则会报错。Time返回一个float类型的时间戳,文件大小以千字节为单位。文件操作:创建、修改、删除、查看。1.创建文件夹:os.mkdir、os.makedirs。os.mkdir('./newdir')#创建目录mkdir只能创建一级目录,并且必须保证上一级目录os.path.dirname(path)存在。如果不存在,则必须使用makedirs。os.mkdir('./newdir2/abc')#报错,newdir2文件夹不存在os.makedirs('./newdir2/abc')#正确,创建多级目录如果目录已经存在,两种方法会报错,一般在使用前会判断是否存在。2.删除目录:os.rmdir、os.removedirs。os.rmdir('./newdir')#删除目录os.removedirs('./newdir2/abc')#删除多级目录rmdir删除的目录必须为空。removedirs会从底层目录往上删除,每一级目录也必须保证为空。3.删除文件:os.remove。open('./abc.txt','w').close()#创建文件os.remove('./abc.txt')#删除文件remove会删除一个文件,该文件必须存在。4.文件移动:os.rename。os.rename('./abc.txt','./ccc.txt')第一个参数是要移动的文件,第二个参数是目标地址。确保要移动的文件存在;目标地址必须保证目录存在,地址不存在。5.文件列表:os.listdir。print(os.listdir('../'))参数写入一个文件目录,返回该目录下所有文件和目录的列表。另一种获取文件列表的方法是使用glob模块使用*作为通配符来查找具有相同格式的文件。importglobprint(glob.glob('../*/*.py'))*匹配任意字符,可以实现比listdir更强大的功能。6.遍历文件夹:os.walk。使用listdir实现文件夹遍历只能在常规文件夹上实现。walk可以实现一个文件夹下所有文件的遍历。forroot,dirs,filesinos.walk('../06/'):forfinfiles:filename=os.path.join(root,f)print(filename)root是当前遍历的子目录,walk循环逐层遍历所有子目录。dirs是子目录下的所有文件夹,用的比较少。files是子目录下的所有文件,可以实现文件遍历和查找的各种功能。运行交互式Python有两种方式:一种是脚本方式,也就是我们开发的python文件。另一种是交互式的,主要用于简单的python运行或者调试。在cmd命令行界面输入python,进入交互界面。输入一段代码,结果会立即显示出来。虽然交互相对简单,复杂功能实现难度大,但也开发了Jupyternotebook等数据分析和机器学习常用的工具。以后会有关于Jupyter的相关课程。命令行脚本的运行方式是命令行:在cmd界面通过python命令运行程序。如果我们观察Pycharm执行Run时打印的内容,其实是执行了venv下的python命令,后面是要执行的文件。命令行实际上使用了一个python命令,它的第一个参数必须是一个文件。命令参数:除了python命令后的第一个文件参数外,为了方便也可以跟在任意参数后面。Pycharm中添加参数:点击右上角的下拉框,选择EditConfigurations。左边都是执行配置,我们可以自己加一个。输入执行配置名称,选择执行文件,最后在Parameters中写入参数。点击右下角的确定保存。执行,在右上角选择要运行的执行配置,使用旁边的两个按钮进行运行和调试。这里的配置相当于执行pythonmain.py--dirC:/abc-all得到参数:sys.argv。importsysprint(sys.argv)#获取所有参数返回一个参数列表,第一个是执行文件,后面几个就是我们刚才写的参数。下面是通过获取参数显示输入目录下的文件列表,-all时同时输出文件夹。deflistdir(path,with_dir=False):result=[]forfinos.listdir(path):ifwith_diroros.path.isfile(os.path.join(path,f)):result.append(f))返回结果if__name__=='__main__':ifsys.argv[1]=='--dir':path=sys.argv[2]with_dir=len(sys.argv)>3andsys.argv[3]=='all'print(listdir(path,with_dir))更优雅的方式:argparse模块。importargparseif__name__=='__main__':parser=argparse.ArgumentParser()#开启参数解析parser.add_argument('--dir',default='.')#强制位置参数parser.add_argument('all',nargs='?',default=False)#可选参数,默认为Falseargs=parser.parse_args()print(listdir(args.dir,args.all))首先创建一个参数parser解析器,通过add_argument添加参数定义,最后解析为参数。添加--dir位置参数,以横杠开头的参数都是位置参数,后面必须跟参数值。添加所有可选参数,nargs='?'定义optional,不存在则默认为False,存在则解析为all。最后通过parse_args将参数解析成变量,然后直接使用成员变量调用。打包学习命令行参数后,我们就可以让用户根据设置的参数来使用程序了。但是,这也需要用户安装环境。为了让用户能够零基础的使用我们的程序,打包是很有必要的。打包模块:pyinstaller模块。如果安装失败,请先安装轮子模块。打包命令:首先打开最下方的命令行模式Terminal。输入.\venv\Scripts\pyinstaller.exe-F.\07\main.py第一个是pyinstall命令,-F表示全部打包,最后是启动文件。然后就可以在当前工程下生成一个dist文件夹,里面就是打包好的exe文件。然后我们调用main.exe配置传递参数不仅可以通过命令行参数,还可以通过配置文件。配置文件:ini文件。创建config.ini配置文件。[DEFAULT]dir=C:/Users[INFO]x=1save=True[]是一个section,下面是具体选项。读取配置文件:configparser模块。conf=configparser.ConfigParser()#创建对象conf.read('config.ini')#读取文件print(conf['DEFAULT']['dir'])#获取配置print(int(conf['INFO']['x']))print(conf['INFO']['save']=='True')输出:ConfigParser对象,读取配置文件后,可以直接获取里面的配置。配置[section][option]是通过类似字典的方式获取的,所有的配置都是以字符串的形式获取的。其他获取方式:get、getint、getboolean、getfloat。conf.get('DEFAULT','dir')#获取配置conf.getint('INFO','x')#intconf.getboolean('INFO','save')#boolean和直接访问的区别是get方法可以执行底层转换。判断方法:has_section,has_option。conf.has_section('DEFAULT')#是否有sectionconf.has_option('INFO','dir')#是否有option我们发现[INFO][dir]的option是存在的,也就是第二行代码返回True。这是因为DEFAULT是配置文件的父类,其他所有部分都继承自DEFAULT。与类一样,它们也可以被覆盖。配置遍历:部分、选项、项目。print(conf.sections())#Returnallsectionsprint(conf.options('INFO'))#Returnalloptionsoutputundersection:sections不返回DEFAULT因为是父类。从父类继承的目录也在选项中返回。对于组,conf.items()中的部分:对于键,section.items()中的值:print('conf[{}][{}]={}'.format(group,key,value))输出:循环中的group和section分别是name和section对象。section对象还有一个返回选项内容的items方法。上面的代码打印所有配置。配置修改:add_section、set、remove_option、remove_section。conf.add_section('DEBUG')#添加新部分conf.set('DEBUG','y','1')#添加新选项conf.set('INFO','dir','C:/Users/lin02')#Modifyoptionwithopen('config.ini','w')asf:conf.write(f)#写入文件使用add_section,设置添加修改,然后写入文件,一般我们会覆盖原文件。remove_option,remove_section用于删除。如果没有进行[read]操作,上述方法可以直接创建配置文件。在命令行上添加一个默认值,从配置文件中读取。importargparseimportconfigparserif__name__=='__main__':conf=configparser.ConfigParser()conf.read('config.ini')default_dir=conf.get('INFO','dir')#获取默认值parser=argparse.ArgumentParser()parser.add_argument('--dir',default=default_dir)parser.add_argument('all',nargs='?',default=False)args=parser.parse_args()print(listdir(args.dir,args.all))重新打包后,把config.ini和exe文件放在同一目录下,就可以正常使用了。因为我们使用的是相对路径,而程序的相对路径就是exe所在的路径。有了配置文件,我们的程序就更加完整了。练习1.编写dir命令的简化版本。2、写一个批量修改文件名的工具,打包成exe。自己创建一个文件夹,把里面的任何文件都push进去。为以下文件批量添加前缀。按照文件创建时间排序,在扩展前加序号,序号递增。main.exe--dirC:\abc--prefixhhxxx.txt=>hhxxx1.txtgithub:https://github.com/lvancer/course_python