Python学习--9、10

    技术2023-09-24  77

    Chapter 9

    函数含义shutil.copy(source,destination)将路径source处的文件复制到路径destination处的文件夹shutil.copytree(source,destination)将路径source处的文件夹复制到路径destination(新文件名)处的文件夹shutil.move(source,destination)移动和改名:移动source处的文件夹,返回新路径的字符串;移动文件,返回包括原来的文件名的路径os.unlink(path)删除path处的文件os.rmdir(path)删除path处的空文件夹shutil.rmtree(path)永久删除path处的文件夹(包含内部所有文件和文件夹)send2trash.send2trash(path)将path文件(夹)发送到回收站os.walk(path)返回字符串列表,用for循环可遍历path文件夹 import os for foldername,subfolder,filename in os.walk('C:\\Users\\hl\\Downloads'): print('The current folder is: '+foldername) for subfolder in subfolder: print('SUBFOLDER OF '+foldername+' : '+subfolder) for filename in filename: print('FILENAME OF '+foldername+' : '+filename) print("") >>> SUBFOLDER OF C:\Users\hl\Downloads : Stardock FILENAME OF C:\Users\hl\Downloads : desktop.ini FILENAME OF C:\Users\hl\Downloads : lxml-4.5.1-cp38-cp38-win_amd64.whl FILENAME OF C:\Users\hl\Downloads : pyperclip-1.8.0.tar.gz FILENAME OF C:\Users\hl\Downloads : python-3.8.3-amd64.exe FILENAME OF C:\Users\hl\Downloads : python学习(1.2.md FILENAME OF C:\Users\hl\Downloads : Scrapy-2.2.0-py2.py3-none-any.whl FILENAME OF C:\Users\hl\Downloads : text2.mp3 FILENAME OF C:\Users\hl\Downloads : text2audio.mp3 FILENAME OF C:\Users\hl\Downloads : Twisted-19.10.0-cp38-cp38-win_amd64.whl FILENAME OF C:\Users\hl\Downloads : wheel-0.34.2-py2.py3-none-any.whl The current folder is: C:\Users\hl\Downloads\Stardock

    zipfile 模块压缩文件

    >>> import shutil,os,zipfile >>> os.chdir('C:\\Users\\hl\\Desktop\\caogao') #改变当前工作路径 >>> azip=zipfile.ZipFile('caogao.zip') >>> azip.namelist() #文件中所有文件夹和文件的字符串列表 ['caogao/', 'caogao/answerquiz1.txt', 'caogao/answerquiz2.txt', 'caogao/answerquiz3.txt', 'caogao/answerquiz4.txt', 'caogao/answerquiz5.txt', 'caogao/answerquiz6.txt', 'caogao/capitalquiz1.txt', 'caogao/capitalquiz2.txt', 'caogao/capitalquiz3.txt', 'caogao/capitalquiz4.txt', 'caogao/capitalquiz5.txt', 'caogao/capitalquiz6.txt', 'caogao/hi.txt'] >>> ainfo=azip.getinfo('caogao/hi.txt') >>> ainfo.file_size #原来文件的大小 42 >>> ainfo.compress_size #压缩后的文件大小 42 >>> azip.extractall() #将压缩文件解压到当前文件夹 >>> azip.extract ('caogao/hi.txt','C:\\Users\\hl\\Desktop\\学校') #将文件解压到指定文件夹 'C:\\Users\\hl\\Desktop\\学校\\caogao\\hi.txt' >>> azip.close() # 创建压缩文件,必须以写模式打开,类似于open函数 >>> zzip=zipfile.ZipFile('z.zip','w') # 创建z.zip >>> zzip.write ('hi.txt',compress_type=zipfile.ZIP_DEFLATED ) >>> zzip.close()

    项目: 将带有美国风格日期的文件改名为欧洲风格日期

    #! pyrhon3 # renamedate--重命名 import os,re,shutil date=re.compile(r'''^(.*) #匹配日期前的所有字符 ((0|1)?\d)- #匹配月份 ((1|2|3|0)?\d)- #匹配日期 ((19|20)?\d\d) # 匹配年份 (.*)$''',re.VERBOSE) for name in os.listdir('C:\\Users\\侯林\\Desktop\\caogao'): mo=date.search(name) if mo==None: continue before=mo.group(1) month=mo.group(2) daliy=mo.group(4) year=mo.group(6) after=mo.group(8) euroname=before+daliy+'-'+month+'-'+year+after #得到文件的路径 path=os.path.abspath ('C:\\Users\\侯林\\Desktop\\caogao') name=os.path.join (path,name) euroname=os.path.join(path,euroname) print('Renaming "%s" to "%s" '%(name,euroname)) shutil.move(name,euroname) >>> Renaming "C:\Users\hl\Desktop\caogao\answerquiz1 12-5-2010.txt" to "C:\Users\hl\Desktop\caogao\answerquiz1 15-2-2010.txt" Renaming "C:\Users\hl\Desktop\caogao\answerquiz3 03-05-2001.txt" to "C:\Users\hl\Desktop\caogao\answerquiz3 005-3-2001.txt" Renaming "C:\Users\hl\Desktop\caogao\answerquiz6 3-15-2009.txt" to "C:\Users\hl\Desktop\caogao\answerquiz6 15-3-2009.txt" Renaming "C:\Users\hl\Desktop\caogao\capitalquiz3 09-2-2015.txt" to "C:\Users\hl\Desktop\caogao\capitalquiz3 02-9-2015.txt" Renaming "C:\Users\v\Desktop\caogao\capitalquiz5 2-16-2020.txt" to "C:\Users\hl\Desktop\caogao\capitalquiz5 16-2-2020.txt"

    项目:将一个文件夹备份到一个zip文件

    import zipfile,os def backuptozip(folder): folder=os.path.abspath(folder) num=1 while True: zipfilename=os.path.abspath(folder)+str(num)+'.zip' if not os.path.exists(zipfilename): break num=num+1 print('Creating %s...'%(zipfilename)) backupzip=zipfile.ZipFile(zipfilename,'w') for foldername,subfolders,filenames in os.walk(folder): print('Adding files in %s...'%(foldername)) backupzip.write(foldername) for filename in filenames: newbase=os.path.basename(folder)+'_' if filename.startswith(newbase) and filename.endswith(newbase): continue backupzip.write(os.path.join(foldername,filename)) backupzip.close() print('Done') backuptozip('C:\\Users\\hl\\Desktop\\python caogao')

    结果如下: 9.8 实践项目

    # 9.8.1 import os,shutil os.makedirs('D:\\Move') for foldername,subfolders,filenames in os.walk('C:\\Users\\hl\\Desktop\\python caogao'): for filename in filenames: if filename.endswith('.txt'): filename=os.path.join (foldername, filename) shutil.copy(filename,'D:\\Move') else: continue

    结果:

    # 9.8.2 # 打印出大于1MB的文件的绝对路径 import os folder='C:\\Users\\hl\\Desktop\\学校' for foldername,subfolders,filenames in os.walk(folder): for filename in filenames: path=os.path.join(foldername,filename) if os.path.getsize(path)/1024/1024>=1: print(path) >>> C:\Users\hl\Desktop\学校\党课.pptx C:\Users\hl\Desktop\学校\打印\(外文原文)人力资源约束的研发项目调度优化模型与算法.pdf C:\Users\hl\Desktop\学校\运筹学第三章笔记\运筹学笔记Screenshot_20191102_224710.jpg C:\Users\hl\Desktop\学校\运筹学第三章笔记\运筹学笔记Screenshot_20191102_224726.jpg # 9.8.3 import os,re,shutil folder='C:\\Users\\hl\\Desktop\\python caogao\\Papers' files=re.compile(r'(answerquiz)(\d)(.txt)') print('原文件:') filenames={} for filename in os.listdir(folder): mo=files.search(filename) if mo==None: continue print(mo) num=mo.group(2) filenames[int(num)]=filename # print(filenames) index=1 maxnum=max(filenames.keys()) while index<maxnum: if index not in filenames.keys(): print('缺失的编号为:'+str(index)) new_filename='answerquiz'+str(index)+'.txt' shutil.move(os.path.join(folder,filenames[maxnum]),os.path.join(folder,new_filename)) filenames[index]=new_filename del filenames[maxnum] maxnum=max(filenames.keys()) index+=1 print('新文件名:\n'+str(filenames.values())) >>> 原文件: <re.Match object; span=(0, 15), match='answerquiz1.txt'> <re.Match object; span=(0, 15), match='answerquiz2.txt'> <re.Match object; span=(0, 15), match='answerquiz3.txt'> <re.Match object; span=(0, 15), match='answerquiz4.txt'> 新文件名: dict_values(['answerquiz1.txt', 'answerquiz2.txt', 'answerquiz3.txt', 'answerquiz4.txt'])

    Chapter 10

    raise-抛出异常

    raise语句必须和try,except语句一起使用,否则程序会崩溃语法:raise Exception(有用的错误信息)取得反向跟踪的字符串,导入traceback模块,调用traceback.format_exe()函数得到字符串形式 #定义一个boxprint(),创建一个小盒子的图像 def boxprint(symbol,width,height): if len(symbol)!=1: raise Exception('Symbol must be a single character string.') if width<=2: raise Exception('Width must be greater than 2.') if height<=2: raise Exception('Height must be greater than 2.') print(symbol*width) for i in range(height-2): print(symbol+' '*(width-2)+symbol) print(symbol*width) for sym,w,h in (('*',4,4),('0',20,5),('x',1,3),('zz',3,3)): try: boxprint(sym,w,h) except Exception as err: print('An exception happened: '+str(err)) >>> **** * * * * **** 00000000000000000000 0 0 0 0 0 0 00000000000000000000 An exception happened: Width must be greater than 2. An exception happened: Symbol must be a single character string. #取得反向跟踪的字符串,导入traceback模块,调用traceback.format_exe()函数得到字符串形式 import traceback try: raise Exception('This is an error message.') except: errorfile=open('errorinfo.text','w') errorfile.write(traceback.format_exc()) errorfile.close() print('The traceback info was written to errorinfo.txt') >>> The traceback info was written to errorinfo.txt

    assert-断言 #语法(assert 条件(返回True或False的语句),条件为False时显示的表达式) #assert语句含义:我断言这个语句为真,若不为真,程序某位置将有缺陷。

    # 在交通灯模拟中使用断言 m1={'ns':'green','ew':'red'} m2={'ew':'red','ns':'green'} def switchlights(stoplight): for key in stoplight.keys(): if stoplight[key]=='green': stoplight[key]='yellow' elif stoplight[key]=='yellow': stoplight[key]='red' elif stoplight[key]=='red': stoplight[key]='green' assert 'red' in stoplight.values(),'Neither light is red.'+str(stoplight) switchlights(m1) >>> Traceback (most recent call last): File "C:/Users/侯林/Desktop/python caogao/10.3.py", line 14, in <module> switchlights(m1) File "C:/Users/侯林/Desktop/python caogao/10.3.py", line 12, in switchlights assert 'red' in stoplight.values(),'Neither light is red.'+str(stoplight) AssertionError: Neither light is red.{'ns': 'yellow', 'ew': 'green'}

    日志

    模块:logging自动创建LogRecord对象,保存该事件的信息及对应细节尽量不要用print()函数,调试完成后删除print函数时,可能会误删有用信息 import logging # debug函数调用basicConfig(),打印basicConfig()函数中指定的内容,并包括传递给debug()的信息 logging.basicConfig(level=logging.DEBUG,format='%(asctime)s - %(levelname)s - %(message)s') logging.debug('Start of program') def factorial(n): logging.debug('start of factorial(%s%%)'%(n)) total=1 for i in range(1,n+1): total*=i logging.debug('i is '+str(i)+', total is '+str(total)) logging.debug('End of factorial(%s%%)' %(n)) return total print(factorial(5)) logging.debug('End of program')

    日志级别

    级别日志函数描述DEBUGlogging.debug()最低级别,用于小细节INFOlogging.info()用于记录程序中一般事件的信息,或确认一切工作正常WARNINGlogging.warning()用于表示可能的问题,它不会阻止程序的工作,但将来可能会ERRORlogging.error()用于记录错误,它导致程序做某事失败CRITICALlogging.critical()最高级别,用于表示致命的错误,它导致或将要导致程序完全停止工作-logging.disable(logging.CRITICAL)禁用所有日志 消息

    IDLE的调试器

    IDLE的调试器含义Go导致程序正常执行至终止或断点Step导致调试器执行下一步,然后在此暂停,若下一行是函数调用,则会步入该函数中Over执行下一行代码,与Step按钮相似,步入该函数,但会快速执行函数调用Out全速执行下一行代码,可以从点击step步入的函数中走出来Quit完全停止调试

    注:断点,迫使调试器暂停,右键,set breakpoint。 10.8实践项目

    import random guess='' while guess not in ('heads','tails'): print('Guess the coin toss! Enter heads or tails.') guess=input() toss=random.choice(['heads','tails']) #0 is tails,1 is heads if toss==guess: print('You get it!') else: print('Nope!Guess again!') guess=input() if toss==guess: print('You get it!') else: print('Nope.You are really bad at this time.') >>> Guess the coin toss! Enter heads or tails. heads You get it!
    Processed: 0.011, SQL: 9