《Python编程》 课件 李锡荣 第1-3章-认识Python -数据存储与网上数据抓取_第1页
《Python编程》 课件 李锡荣 第1-3章-认识Python -数据存储与网上数据抓取_第2页
《Python编程》 课件 李锡荣 第1-3章-认识Python -数据存储与网上数据抓取_第3页
《Python编程》 课件 李锡荣 第1-3章-认识Python -数据存储与网上数据抓取_第4页
《Python编程》 课件 李锡荣 第1-3章-认识Python -数据存储与网上数据抓取_第5页
已阅读5页,还剩201页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《实用Python编程》

第1讲:认识Python实用Python编程教研组提纲Python简介编程环境搭建安装AnacondaJupyterNotebook交互式编程环境VSCode集成开发环境2欢迎来到Python的世界!Python是一种易学易用的编程语言很适合非计算机专业、零编程基础的同学学习3Python由来及发展1990年代初由荷兰程序员吉多·范罗苏姆(GuidovanRossum)开发4inDecember1989,Iwaslookingfora"hobby"programmingprojectthatwouldkeepmeoccupiedduringtheweekaroundChristmas.Myoffice...wouldbeclosed,butIhadahomecomputer,andnotmuchelseonmyhands.IdecidedtowriteaninterpreterforthenewscriptinglanguageIhadbeenthinkingaboutlately:adescendantofABCthatwouldappealtoUnix/Chackers.IchosePythonasaworkingtitlefortheproject,beinginaslightlyirreverentmood(andabigfanof

MontyPython'sFlyingCircus).现由Python软件基金会(PSF)负责开发Python的核心发行版本为什么要学Python?当今人工智能、数据科学等领域的首选编程语言5/top-programming-languages-2025为什么要学Python?直观的语法Python语法结构非常接近日常英语判断一个元素是否在列表里

ifxinlist_a:这种直观性极大降低了学习门槛强大的标准库Python自带标准库功能丰富,涵盖了网络通信、文件处理、数据统计等,可完成很多日常任务庞大的第三方生态系统数据分析(Pandas)、数值计算(Numpy)、处理Excel(openpyxl)、深度学习(PyTorch)、科学绘图(Matplotlib)、Web应用(Streamlit)、大模型调用(OpenAI)…跨平台Python程序可在不同操作系统之间无缝切换运行6提纲Python简介编程环境搭建安装AnacondaJupyterNotebook交互式编程环境VSCode集成开发环境7安装Anaconda分为两步第1步,从官方下载页面中下载与当前操作系统匹配的Anaconda安装程序8官方下载网址/download点击“SkipRegistration”跳过注册环节根据自己电脑的操作系统下载相应的安装程序文件安装Anaconda分为两步第2步,打开安装文件,并按照安装指引操作,在本地部署Anaconda环境可在安装界面中指定新的安装目录(如

C:\apps\anaconda3)若C:\apps目录不存在,则需手动创建,之后再点击“下一步”按钮9提纲Python简介编程环境搭建安装AnacondaJupyterNotebook交互式编程环境VSCode集成开发环境10JupyterNotebook交互式编程环境不仅编写代码,也记录代码运行过程代码、运行结果、笔记等11代码单元格运行结果#开头的是代码注释,用于理解代码,不影响运行结果“运行代码”按钮Step1.在代码区输入代码Step2.点击

►按钮Step3.观察运行结果用JupyterNotebook编写第一个程序启动JupyterNotebook(以Windows系统为例)12在应用面板中找到AnacondaPrompt并打开在指定目录下启动JupyterNotebook服务(端口8000)按图示依次输入命令并敲击回车键执行执行最后一行命令后,本机的默认网页浏览器会自动弹出并进入JupyterNotebook主界面(见下一张幻灯)在系统桌面下方的搜索栏中输入Prompt用JupyterNotebook编写第一个程序启动JupyterNotebook(以Windows系统为例)13JupyterNotebook主界面若未自动启动,复制网址到浏览器,手动打开工作界面用JupyterNotebook编写第一个程序接着,新建一个Notebook文件14第一步,在Jupyter主界面的文件(File)菜单中选择“新建(New)”→“Notebook”,创建一个名为“未命名(Untitled)”的空白文件在创建过程中可能会弹出如下所示对话框让我们选择内核(kernel)。选默认选项即可。内核是Notebook背后的计算“大脑”。可通过页面右上角的圆圈观察大脑当前状态。正常状态为空心圆。若宕机,会变成实心圆◉。可点击中断按钮◼︎重置。用JupyterNotebook编写第一个程序在新建的Notebook文件的按钮面板下方,有一个光标闪动的绿色框(或蓝色框),称为代码单元格(codecell)在代码单元格中输入示例代码并点击运行(▶︎)按钮15importosos.getcwd()示例代码键盘输入该代码用于获取Notebook所处的工作路径提纲Python简介编程环境搭建安装AnacondaJupyterNotebook交互式编程环境VSCode集成开发环境16VS

Code集成开发环境VisualStudioCode(简称VSCode)是一款由微软开发、跨平台的免费源代码编辑器17VSCode安装访问VSCode官网,下载与本机操作系统对应的版本一路“下一步”安装即可18VSCode官网/为VSCode安装Python插件如图所示三步19①点击VS

Code左侧侧边栏的“方块拼图”图标②在搜索框中输入Python,找到同名插件③点击“安装”用VSCode写一个HelloWorld程序一开始就养成良好的代码文件管理习惯✅一个项目对应一个文件夹❌所有代码都放在一个文件夹下先在指定路径下手动新建一个文件夹(python_study)20点击“打开文件夹”(Open…),在对话框中找到并选中python_study用VSCode写一个HelloWorld程序新建Python文件点击欢迎页面中的“新建文件”,然后点击其上方下拉列表中的“Python

文件”通过快捷键Ctrl+s将新建文件保存为hello.py(注意必须以.py结尾)21用VSCode写一个HelloWorld程序选择解释器(Interpreter)解释器负责将用户编写的代码翻译成计算机能理解的机器指令来运行VSCode在第一次运行Python文件时,会要求用户选择解释器在弹出的列表中选择Anaconda版本即可(路径中带有anaconda)完成选择后,观察VSCode窗口的右下角。如果显示3.x.x(Python版本号),说明已自动识别22用VSCode写一个HelloWorld程序编写代码并运行23①在编辑区敲入代码②点击运行按钮③观察终端界面输出课程大纲第01讲.认识Python第02讲.

Python基础-part1(程序元素、语法与常用数据类型)第03讲.

Python基础-part2(字符串与函数)第04讲.数据存储与文件读写第05讲.Python基础-part3(类、模块、库与新手常见错误)第06讲.网上数据抓取第07讲.

数据清洗与数值计算第08讲.

Pandas表格数据处理与分析第09讲.

sklearn机器学习第10讲.

PyTorch深度学习第11讲.

Matplotlib表格数据可视化第12讲.

Streamlit交互式数据可视化第13讲.

大模型辅助编程第14讲.

大模型二次开发24《实用Python编程》

第2讲:Python基础-A实用Python编程教研组提纲26Python程序中的基本元素让我们从一个例子开始先试着理解一下这段代码是做什么的27input是函数,接受用户从键盘输入的内容user_input和val都是变量,记录用户输入的内容int是函数,将字符串变为整数val%2是算术表达式val%2==0是关系表达式if-else选择性执行指定语句print也是函数,将指定内容输出到屏幕上变量、函数、表达式、流程控制等构成了Python程序的基本元素,这些都是对象(object)一切皆对象对象(object)是Python程序中数据及其操作的载体属性(Attribute):对象内部存储的数据方法(Method):对象可执行的操作标识符(Identity):对象的存储地址28在Notebook中运行示例代码并观察结果基础数据类型数据类型(datatype):具有相同性质的对象的集合29基础数据类型使用内容不可变的数据类型可以避免误操作可用三元组表示出生日期,这样创建之后再尝试修改,代码就会报错30基础语法变量(variable):对特定对象的命名命名规则由英文字母、数字、下划线组成,但不能以数字开头不能使用Python关键字/保留字区分大小写/大小写敏感31importkeywordprint(keyword.kwlist)Python3支持包括中文在内的Unicode字符作为标识符,中文或特殊符号也能作为变量名。但不推荐。课堂练习-2-1-1尝试声明不同数据类型的变量,体会数值(整数、浮点数)、字符串(英文、暂时不考虑中文)变量的命名规则(一开始就养成好的编程习惯)大小写敏感(但不推荐)同一变量指向不同数据类型(但不推荐)不能使用关键字(尝试在Notebook中执行False=2)实用Python编程32基础语法表达式(expression):由常数、变量、运算符及函数调用等组成的语法结构,是Python程序中最基本的逻辑单元33表达式的常见功能赋值数值计算关系比较逻辑运算函数调用成员判断身份判断…基础语法运算优先级当表达式中包含多个运算符时,运算的执行顺序由运算符优先级决定方括号[]:索引/切片点号.:访问属性算术运算:乘方(幂)>乘、除>加、减比较运算:各种比较运算同级赋值运算:总在最后执行对于同一级的运算符,则按自左向右顺序进行计算34记忆可能会出错。好的编程习惯是在表达式中用括号明确运算优先级课堂练习-2-1-235基础语法流程控制(FlowControl):程序运行时每条代码的执行顺序顺序结构条件分支(if-else)循环结构(for/while)36流程控制if-else条件分支37语法模板分数定级流程控制使用for循环遍历一个列表38流程控制使用内置的range函数产生循环序列39课堂练习2-1-3比较range(10),range(1,10),range(1,10,2)的循环范围40流程控制更简洁的for循环使用列表推导式(ListComprehension)适用场景:可单行完成的数据处理41流程控制当循环次数无法预先指定时,使用while循环42未输出所有满足条件的记录,代码有逻辑错误(Bug)。怎么解决?尝试从data中找出所有分数大于85的记录循环中断当我们需要改变循环的正常执行流程时,可用break和continue语句只能在循环体中使用执行到break语句时,立即结束当前循环执行到continue语句时,直接进入下一次循环逻辑上,要求与if-else条件语句配合使用(为什么?)43课堂练习2-1-4在课堂练习2-1-2的基础上44流程控制try-except异常处理45带有异常处理机制的除法程序语法模板常用数据操作三种最常用的“容器类”数据类型列表(list)、集合(set)、字典(dict)46列表用于顺序存储数据示例

numbers=[1,2,3,4,5]典型场景:存储一组同类型数据47访问列表读取列表中的元素通过索引(从0开始)访问单个元素通过切片(左闭右开)访问一组元素48操作列表增、删、改、查49集合集合存储数据的特点元素的存储地址是无序的不能通过索引访问特定元素集合中元素取值不能重复示例s=set([1,2,3,3])#{1,2,3}注意元素3已被去重典型场景:去重、快速判断元素是否存在50集合的日常操作创建集合添加、删除元素成员测试51集合的日常操作用for循环遍历集合中的元素52相同元素只能出现一次字典存储特点逻辑结构:键-值对(Key-ValuePair)的集合通过“键”访问“值”,“键”唯一示例取快递时,取件码就是键,而快递件就是值典型场景:描述对象属性,计数53字典的日常操作创建字典元素访问、遍历添加、修改、删除54特殊字典类型内置模块collections中的Counter55列表、集合、字典的特点总结与对比56下列哪些语句一定或可能使用了列表/集合/字典对象?len(a)xinadela[1]a.append(“Tom”)a.add(“Tom”)《实用Python编程》

第3讲:Python基础-B(字符串与函数)实用Python编程教研组提纲58从一个文本数据清洗的例子开始如何将格式混乱的账单整理为结构清晰的记录?59data=["2026-08-25_ID98453_JohnDoe_MEAL_$128.50USD","2026/08/26-ID10247-Marta-hotel-$450.00USD","2026.08.26_id00382_ALEX_flight_$1,200.00USD"]('98453','2026-08-25','JohnDoe','MEAL',128.5)('10247','2026-08-26','Marta','hotel',450.0)('00382','2026-08-26','ALEX','flight',1200.0)字符串处理字符串(str)一个字符串是由字符组成的一个序列以引号开头,引号结尾。可以是单引号或双引号,但前后引号必须配

s1=“hellopython”s2=‘helloPython’字符串的长度引号中间包含的字符数(含空白字符)长度为零的字符串称为空串字符串可视为以字符为元素(但内容不可变)的列表因此,列表索引和切片操作同样也适用于字符串尝试将首字母改为大写(s1[0]=‘H’),会报错!60字符串操作创建61字符串操作元素访问索引、切片62字符串操作内容判断63课堂练习-2-2-1编写一个判断口令强度的程序给定一个口令,当它同时满足下列所有条件时,则认为是强口令,否则就是弱口令规则1:口令必须同时包含大小写英文字母、数字和特殊字符(下划线、叹号、冒号)规则2:口令长度不小于864字符串操作str1.find(str2[,start,end])在str1(主串)中查找str2(模式串)可选参数start,end为查找的起点和终点。不指定则从头到尾查找s.replace(old,new[,count])将s中的子串old替换为new可选参数count指定最多替换次数。不指定则全部替换65字符串操作分割(split):将字符串按指定分隔符拆分成一个字符串列表拼接(join):将一个字符串列表或集合用指定连接符拼接成一个字符串连接(concatenation):直接用加号(+)拼接多个字符串对同一个字符串进行重复拼接时,可以用乘法操作66字符串操作f-string格式化输出只要在字符串的引号前加上f作为前缀,就可以在字符串内部用{}直接塞入变量、表达式甚至调用函数67控制小数位、高位补齐:03d代表将整数(decimal)格式化为3位宽度,如果数字本身不足3位,前面用0补齐:.1f代表将浮点数(float)保留1位小数字符串操作转义(escape):改变字符的固有含义在字符串中加入无法直接输入的字符(比如“换行”)让具有特殊功能的字符回归本义(比如引号作为引号而不是分界)68课堂练习-2-2-2修复代码,使字符串能正常输出

Let'sgotothe"Python"class!69函数函数(function)一段被被命名的、用于完成特定任务的代码块使用函数可以让程序更加简洁、易懂、易维护主要用途代码复用:一次编写,到处使用,避免重复劳动模块化求解:将复杂任务拆解为多个函数协作参数化操作:通过输入参数动态调整程序行为70内置函数内置函数(built-infunctions)是Python解释器预先定义好的、无需导入任何模块即可直接使用的函数提供了最基础且高频的操作标准输入与输出input,print数值计算与统计min,max,sum,…数据类型查看与转换type,int,float,str,..序列操作与批处理len,range,any,all,map,zip,…71importbuiltinsprint(dir(builtins))内置函数标准输入与输出键盘输入、屏幕输出72内置函数数值计算与统计73内置函数数据类型查看与转换74内置函数序列操作与批处理75自定义函数自定义函数(user-definedfunctions)由自己编写、具有特定功能的代码块将复杂逻辑封装起来方便代码复用让主程序变得结构清晰、易于维护76创建自定义函数从结构上分为函数头和函数体函数头(functionheader):函数名+参数列表函数名:跟在def之后,遵循变量命名规则参数(可选):函数执行时所需的外部数据,放在括号内参数之间以逗号隔开,即使没有参数,括号也要保留函数体(functionbody):缩进、执行具体逻辑的代码块返回值(可选):函数执行完毕后返回给调用者的值,通过return关键字返回77创建自定义函数类型提示(typehints)在函数头中明确标注参数和函数返回值的数据类型能使代码更容易理解78调用自定义函数函数只有在被调用时,其函数体内的代码才会被执行79变量

a在使用时尚未被赋值。但该函数未被调用,也就不会报错调用自定义函数调用带参数的函数80课堂练习-2-2-3一个牧场每天需要根据动物的种类、体重以及天气情况,计算出它们当天该吃多少饲料。请编写一个名为calculate_feed的自定义函数,实现一键计算。核心计算逻辑:基础饲料量为体重的5%。如果是下雨天,动物不外出活动,消耗变小,基础饲料量需要扣减0.5公斤函数内部要打印一行提示信息,格式为:"【牧场广播】正在为动物名计算配方..."请根据任务设计函数的输入接口(参数)、输出接口(返回值),并给出测试用例81函数参数形式参数(parameters)在函数头中列出的参数名,形式上描述了如何给函数传递数据实际参数(arguments)在函数调用时传递的实际值82在double_func中对形参a的修改不影响实参a变量存的是其所指对象的内存地址,而不是该对象的值(2.1.1节)迷你函数:lambda操作当函数功能可以通过单行表达式实现时,可以使用lambda操作一种匿名、更为简洁的自定义函数使用方式83lambda

参数1,参数2,…:表达式语法课堂练习-2-2-484《实用Python编程》

第5讲:Python基础-C

(类、模块、库及新手常见错误)实用Python编程教研组提纲86类类(Class)是一种将数据和操作数据的函数封装在一起的数据类型属性(Attribute):被类封装的数据方法(Method):定义在类内部的函数87面向对象编程(Object-OrientedProgramming,OOP)的基础概念与核心工具Attributesnamebirth_yearMethodsage()human_age()bark()Instancesd1=Dog(‘Tommy’,2020)d1.bark()d1.human_age()类的定义以保留字class打头,空格之后跟着的是类名类的命名规范大驼峰命名法(UpperCamelCase),每个单词首字母大写,没有下划线例如,Person、PageDownloader保留字self代表该类的一个实例对象(instance)类方法分为实例方法:只能由实例调用静态方法:实例或类均可调用。以@staticmethod装饰88注意缩进类的使用通过创建一个关于该类的实例对象来使用89示例:定义一个Person类设计思路对于Person而言,出生日期是基本属性定义一个三元组birth记录该属性年龄随时间增长,需要实时计算定义一个实例方法get_age判断是否成年并非实例专属定义一个静态方法is_adult90示例:定义一个Dog类并创建多个实例类方法作为一种类内部的函数,仍遵循自定义函数的基本规则一个方法可以调用另一个方法年龄换算方法human_age调用了age方法91课堂练习-2-3-192类的继承通过继承(Inheritance)创建一个新类能自动拥有被继承类的所有功能可以添加属于自己的新功能被继承的类称为基础类或父类(BaseClass)新类称为派生类或子类(DerivedClass)93继承是OOP的一大特性,可极大减少重复代码类的继承语法很简单,在子类名的后面加上带括号的父类名即可在继承过程中,子类可以修改父类已有的方法这种行为在OOP中称为方法重写(MethodOverriding)方法重写可以实现多态(Polymorphism)效果不同类的对象调用同一个方法时,会有不同的表现形态94class

SubClassName(BaseClassName):类的继承传递性PersonEmployeeManager单向性子类中新加的功能不会反向赋予父类95Manger类有多少个属性?课堂练习-2-3-2通过继承Wallet

实现一个儿童版微信钱包类

KidWallet新增一个安全控制:当发红包金额大于10元时,直接拒绝,并提示“【警告】红包金额不能超过10元,已拦截!”96模块若要调用上一讲的calc_linear_gpa,需要把代码复制-粘贴到当前Notebook中真正的代码复用应是一次编写,无限复用为此,需要将calc_linear_gpa放入一个模块中97模块模块(Module)是包含Python对象定义的.py文件对象可以是变量、函数、类等模块名应该符合变量命名规则,同时体现模块功能命名使用全小写字母,若名字太长,则用下划线分隔以提高可读性例如tools.py、utils.py、math_tools.py、data_processor.py98自定义模块通过三步创建一个名为tools的模块99自定义模块使用保留字import导入自定义模块强制重载100import

tools【注意】对于特定模块,同一个进程只会执行一次导入。执行了一次importtools之后,对tools.py的后续修改不会同步更新import

toolsimport

importlibimportlib.reload(tools)定向导入与别名可根据需要选择性导入特定功能语法:from

module_nameimport

func_name为模块设置别名(Alias),简化代码语法:import

module_nameasalias101常用第三方库的默认别名常用内置模块涉及系统与文件处理、数学与数据统计、时间与日期、数据格式等102importsyssys.platform返回本机的操作系统名称常用内置模块可在JupyterNotebook中使用help函数查询特定模块的调用接口103库库(Package)是包含一个或多个模块的目录104第1步.创建名为p3lib的文件夹在Notebook主页空白处,点击鼠标右键,在小窗列表中选中“新建文件夹”,并重命名为p3lib第2步.将tools.py拖拽到p3lib中在当前工作路径下新建一个名为p3lib的自定义库库的使用与导入模块的语法一样,我们也使用import导入库105注意观察这几种导入方式的差别第三方库Python的开源生态提供了大量免费、高效的第三方库106第三方库为便于安装,先更换下载源以避免网络问题在Anaconda命令行环境下,执行下列命令107#添加conda镜像通道condaconfig--addchannels/anaconda/pkgs/free/condaconfig--addchannels/anaconda/pkgs/main/#在安装包时显示下载URLcondaconfig--setshow_channel_urlsyes#修改pip的默认镜像源pipconfigsetglobal.index-url/simple第三方库示例:安装jieba在Anaconda命令行界面中输入下列命令pipinstalljieba108安装完成后,再在命令行中输入命令

python-c“importjieba”如无报错信息,则表明jieba已安装到位新手常见错误只要动手编程,就可能产生代码错误错误主要有两种语法错误(SyntaxError):可由Python解释器发现并报告逻辑错误(LogicError):存在逻辑错误的代码可以“正常”运行不会报错,但输出结果往往与预期不符109语法错误中英文标点符号混淆110语法错误未注意区分变量名大小写实用Python编程111语法错误缩进错误实用Python编程112语法错误赋值与判等混淆实用Python编程113逻辑错误浮点数精度陷阱实用Python编程114正确做法是改用

math.isclose(a,0.3)逻辑错误在遍历列表时修改列表实用Python编程115逻辑错误浅复制隐患容器类对象(列表、集合、词典等)的默认复制为浅复制(ShallowCopy)浅复制可能导致误操作使用深复制(DeepCopy)避免潜在的误操作实用Python编程116逻辑错误变量作用域(VariableScope)错误变量作用域是指一个特定变量可被访问的范围对于一个函数而言,其函数体涉及的变量的作用域仅限于该函数体因此这些变量也被称为局部变量(LocalVariable)在函数外部定义的变量被称为全局变量(GlobalVariable)117逻辑错误根据Python访问变量的规则,当查找一个变量的时候,会先从局部作用域开始查找,若未找到,则再在全局作用域中搜索118在函数fun2内部,count会被当作一个与全局变量同名的局部变量逻辑错误值相等与对象标识相等混用实用Python编程119最后一行,逻辑上x和y应指向不同对象。为什么输出True?《实用Python编程》

第4讲:数据存储与网上数据抓取-A实用Python编程教研组数据存得下来,才能被复用变量中的数据是临时的,会随着Notebook关闭而消失数据的长久保存与复用依赖文件读写121提纲122文件系统基础概念数据储存位置与时效性123位置存储对象时效性内存程序执行过程中产生的数据(变量)临时磁盘文件长久临时的{"name":"JimsHacker","age":52}存入文件(长久的)文件系统基础概念

目录(Directory),也称为文件夹(Folder)计算机用来组织文件的逻辑结构目录可以为空,也可以包含子目录和文件但文件中不能再包含文件或目录124一个文件夹就好比一个房间,目录就是进入该房间的门文件:房间里的物件子文件夹:房间里的房间,子目录就是通过该房间的门文件系统基础概念

目录的层级结构125当前目录上级目录子目录根目录C:\Users\courseC:\UsersC:\Users\course\pycodeC:\给定一个目录,包含它的称为它的上级目录,被它包含的为其子目录没有上级目录的,称为根目录文件系统基础概念

路径(Path)描述了文件或目录所在位置从根目录开始的完整路径称为绝对路径(AbsolutePath)从当前位置开始的路径称为相对路径(RelativePath)路径分隔符Linux

/

Mac系统使用斜杠‘/’Windows系统使用反斜杠‘\’对于

C:\Users\course\pycode路径下的hello.ipynb文件绝对路径是

C:\Users\course\pycode\hello.ipynb若当前位置是pycode,则相对路径是hello.ipynb若当前位置是course,则相对路径是pycode\hello.ipynb126如何获得当前位置?(示例代码1.1)os模块:目录操作

127使用前先通过语句importos导入os为Python内置模块,无需额外安装常用读操作获取当前工作目录os.getcwd()

改变当前工作目录os.chdir()罗列指定目录中的内容os.listdir()os的读操作既不会创建新目录,也不会修改或删除现有目录os模块:常用读操作os.listdir会列出指定目录包含的内容(文件、文件夹/子目录)但不会再列出子目录中的内容os.walk可以遍历到指定目录中的所有内容(含子目录中的)128os.listdir('.')

#列出当前目录下的所有文件和文件夹os模块:常用读操作os.walk在循环遍历过程中每次返回一个“三元组”dirpath:当前正在遍历的那个文件夹的绝对路径(字符串)dirnames:当前文件夹下包含的所有子文件夹名字(列表)filenames:当前文件夹下包含的所有文件名字(列表)129fordirpath,dirnames,filenamesinos.walk(root_path):

print(f"当前正在扫描的目录:{dirpath}")

print(f"发现的子文件夹:{dirnames}")

print(f"发现的文件:{filenames}")

print("-"*50)os模块:常用写操作创建单级目录os.mkdir创建多级目录os.makedirs130os.mkdir('dir1')

#在当前目录下新建一个名为dir1的文件夹,若同名文件夹存在,则报错os.makedirs('dir1/dir2/dir3')

#在相对路径为dir1/dir2的目录中新建一个名为dir3的文件夹。若dir1或dir2不存在,则会在对应层级自动创建os.makedirs('dir1',

exist_ok=True)

#同名文件夹存在时不报错os模块:常用写操作删除单级空目录os.rmdir删除多级空目录os.removedirs删除文件os.remove重命名文件或文件夹os.rename(old_name,new_name)131若目录不空,报错

OSError:[Errno66]Directorynotempty课堂练习3-1-1创建多级目录再删除132先创建os.makedirs('test1/test2/test3',exist_ok=True)open('test1/test2/test3/a.txt','w').write('12345’)再删除'test2’最后将'test1'再重命名为'test1-renamed'os.path模块:路径操作使用前先通过importos或者

importos.path导入存在性判断判断路径是否存在os.path.exists判断路径所指的是否为文件os.path.isfile判断路径所指的是否为目录(文件夹)os.path.isdir获取路径获取绝对路径os.path.abspath133尝试获取一个不存在的文件的绝对路径:os.path.abspath('xyz.123')观察一下代码的执行结果,是报错,还是返回一个不存在的路径?os.path模块:路径操作路径拼接os.path.join路径拆分拆分为上级目录与文件名os.path.split拆分为文件名与扩展名os.path.splitext134这些函数会根据当前操作系统自动选择合适的路径分隔符os.path.join("/path/to","file.txt")'/path/to/file.txt'('/path/to','file.txt')('/path/to/file','.txt')os.path.splitos.path.splitext读取文件基础信息文件大小os.path.getsize最后修改时间os.path.getmtime#m是modify最后访问时间os.path.getatime#a是access135综合应用:遍历目录统计文件信息需求:在一个指定的文件夹下找出所有Word文档并按照最后修改时间从后到前排序输出136任务拆解实现方案获取指定文件夹下的所有文件使用os.walk函数访问多级嵌套的子文件夹判断是否为Word文件

用字符串的endswith函数检查是否以".docx"结尾获取文件最后修改时间调用os.path.getmtime函数返回修改时间戳所有Word文件按修改时间从后到前排序用列表汇集每个Word文件及其修改时间戳,并调用列表内置的sort方法综合应用:遍历目录统计文件信息列表排序时如果其元素是多元组,默认会选取多元组的第一项作为排序值将修改时间戳mtime

作为二元组的第一项,便于排序操作也可以用lambda操作(2.4.3节)默认情况下sort方法返回的是升序(即按照修改时间从旧到新)而任务要求是降序,因此需要将sort方法的reverse参数设为True137综合应用:遍历目录统计文件信息完整实现138课堂练习3-1-2文件统计在你的JupyterNotebook当前工作路径下将ch3-txt.zip解压缩1)先通过os.path.exists检查数据是否就绪2)统计ch3-txt目录下包含的文件夹数量和txt文本文件数量3)进一步,统计文件里存放了两位数的文件数139csvjsonhtmltxt常用文件类型的读写操作140文本文件纯文本txt结构化csv,json,html二进制文件(进阶内容)jpg,excel,word,sqliteTXT纯文本文件纯文本文件(以.txt为扩展名)是最基础的文件类型以字符序列形式存储数据,可读性强适合存储结构简单的文本数据141pybook-data/ch3/rawdata.txt/li-xirong/python-book/blob/main/pybook-data/ch3/rawdata.txtTXT纯文本文件从TXT文件中读取数据fr=open(input_file)以读模式打开一个文件,并返回一个文件对象frfr.readlines()按行一次性读取整个文件,返回一个字符串列表fr.read()一次性读取整个文件,返回一个字符串fr.close()关闭文件142TXT纯文本文件数据解析line.strip()#去掉换行符(\r,\n)以及行尾的空格line.split(‘,’)#以逗号为分隔符,分割出各个字段‘,’.join(elems)#用逗号拼接各个字段143TXT纯文本文件将数据写入TXT文件fw=open(output_file,“w”)#以写模式打开文件,并返回一个文件对象fwfw.write()#写入文件fw.close()#关闭文件144结构化文本文件CSV、JSON和HTML文件存储文本数据可视为带特殊扩展名的纯文本文件具备结构化的特点,可用相应Python库将文本数据转为结构化数据145CSV文件CSV(Comma-SeparatedValues)是一种轻量级结构化文本格式,大量用于表格数据的存储特点是以纯文本形式表示二维表格,每行对应一条记录,每条记录的不同字段使用特定分隔符(通常是英文逗号)隔开CSV文件的第一行通常是用于解释各列含义的表头不含标注表头也符合CSV规范146TXT转CSV使用前先通过importcsv导入使用csv.writer创建一个csv写对象147withopen(…)

as

fr省去手动关闭文件对象的麻烦csv会自动换行,所以调用open函数时,换行符参数newline要设置成空字符串JSON文件JSON(JavaScriptObjectNotation)是一种简洁轻量、易于解析的结构化文本格式,广泛用于列表、键-值对等数据的存储148[{"name":"iPhone17","price":7000},{"name":"MacBookPro","price":12000}]最常用的对象数组(arrayofobjects)格式整个文件以一个方括号[]包裹,里面是多个结构相同的

JSON对象,对象之间以逗号隔开CSV转JSON使用json.dump将每个字典对象写入json文件为了正确显示汉字,设置参数ensure_ascii=False149[{"姓名":"张伟","性别":"男","出生日期":"1999-05-12","学号":"2018010101","所属学院":"计算机学院","入学年份":"2018","籍贯":"江苏省南京市","GPA":"3.6","总学分":"142"},{"姓名":"李静","性别":"女","出生日期":"2000-08-23","学号":"2019020203","所属学院":"经济学院","入学年份":"2019","籍贯":"浙江省杭州市","GPA":"3.8","总学分":"126"},{"姓名":"王明","性别":"男","出生日期":"2001-02-14","学号":"2020030305","所属学院":"外国语学院","入学年份":"2020","籍贯":"广东省广州市","GPA":"3.2","总学分":"108"},...]

HTML文件网页是用html语言写的超文本标记语言(HyperTextMarkupLanguage,html)150<html><body><h1>helloworld</h1><h3>helloworld</h3></body></html>存为hello.html并用浏览器看打开看看HTML文件html标签以尖括号括起来,开始标签与结束标签成对出现开始标签<html><body><p><font>结束标签</html></body></p></font>嵌套:一对标签可以被包含在另一对标签中特殊标签,只能出现一次:html,head,title,body151<html><body>hi,<spanstyle="font-style:italic;font-size:58px;font-weight:bold;">this</span>is<spanstyle="color:blue;font-size:28px">my</span>firsthtml<spanstyle="color:red;font-size:20px">page</span></body></html>JSON转HTMLHTML本质上就是文本以f-string构造HTML字符串,再以文本文件的方式保存152<table>标签定义HTML的表格<th>标签定义表头,即学生记录的相应字段<tr>标签定义表格的一行<td>标签定义表格的一个单元格<img>标签定义图片src:图片路径width:图片的显示宽度height:图片的显示高度置于<head>内的<style>标签定义html各元素的显示样式JSON转HTML在浏览器中打开students.html153试试将第18行改为style=“”,即使用默认样式HTML文件解析第三方库BeautifulSoup可从HTML中提取目标信息需要借助解析器(Parser)解析HTML文件通常使用python自带的html.parser两种初始化BeautifulSoup对象的方法BeautifulSoup(文件对象,'html.parser')BeautifulSoup(字符串,'html.parser')154HTML文件解析BeautifulSoup解析和操作HTML文档的主要接口是一个名为bs4.element.Tag的类,用于表示HTML文档中的标签元素

Tag对象可通过BeautifulSoup对象的两个标签查找方法find和find_all获得155HTML文件解析Tag类的常用属性name标签名text标签及其所有子标签的文本内容contents标签的直接子节点列表attrs标签自身属性的字典156课堂练习3-1-3HTML文件解析给定以下HTML片段,完成相应解析任务:<table><tr><th>姓名</th><th>GPA</th></tr><tr><td>张伟</td><td>3.6</td></tr><tr><td>李静</td><td>3.8</td></tr><tr><td>王明</td><td>3.3</td></tr></table>用BeautifulSoup提取所有学生的姓名与GPA,保存到JOSN文件找出GPA最高的学生姓名157[{"姓名":"张伟","GPA":3.6},{"姓名":"李静","GPA":3.8},{"姓名":"王明","GPA":3.3}]提示:多行文本的字符串使用三引号(TripleQuotes)作为分界符三个连续的单引号或者三个连续的双引号课堂练习3-1-4HTML转TXT通过HTML文件解析,将students.html转存为students.txt忽略照片158张伟,男,1999-05-12,2018010101,计算机学院,2018,江苏省南京市,3.6,142李静,女,2000-08-23,2019020203,经济学院,2019,浙江省杭州市,3.8,126王明,男,2001-02-14,2020030305,外国语学院,2020,广东省广州市,3.2,108刘芳,女,1999-11-05,2018040407,法学院,2018,湖北省武汉市,3.7,156陈浩,男,2000-07-19,2019050509,医学院,2019,四川省成都市,3.9,132杨雪,女,2001-04-30,2020060611,艺术学院,2020,陕西省西安市,3.4,112赵阳,男,1999-09-17,2018070713,机械工程学院,2018,山东省济南市,3.5,148周琳,女,2000-12-08,2019080815,数学学院,2019,湖南省长沙市,3.8,128吴强,男,2001-03-21,2020090917,物理学院,2020,河南省郑州市,3.1,98郑婷婷,女,1999-06-25,2018101019,化学学院,2018,福建省福州市,3.6,152孙宇航,男,2000-01-14,2019111121,计算机学院,2019,辽宁省沈阳市,3.7,134朱雨欣,女,2001-10-07,2020121223,经济学院,2020,安徽省合肥市,3.3,104马超,男,1999-08-03,2018131325,外国语学院,2018,黑龙江省哈尔滨市,3.4,146胡佳怡,女,2000-05-28,2019141427,法学院,2019,广西壮族自治区南宁市,3.9,130林志强,男,2001-07-11,2020151529,医学院,2020,云南省昆明市,3.0,92徐雅雯,女,1999-12-19,2018161631,艺术学院,2018,山西省太原市,3.8,150黄博文,男,2000-04-02,2019171733,机械工程学院,2019,江西省南昌市,3.5,136高思琪,女,2001-09-15,2020181835,数学学院,2020,贵州省贵阳市,3.2,100梁家辉,男,1999-03-27,2018191937,物理学院,2018,甘肃省兰州市,3.6,144谢欣怡,女,2000-11-09,2019202039,化学学院,2019,吉林省长春市,3.7,138进阶内容:二进制文件读写(3.2.3节)JPG/PNG图像Excel表格Word文档SQLite数据库159《实用Python编程》

第6讲

数据存储与网上数据抓取-B实用Python编程教研组提纲161网上数据的重要性互联网是消息发布与传播的主要渠道互联网上的数据是大数据分析与决策的重要基础填报高考志愿不仅需要参考绝对分数,还需要省份排名信息排名信息往往在不同网站上,这就要求能够对网上数据进行批量抓取与汇总访问网站数据涉及向服务器发送请求(Request),以及解读服务器返回的响应(Response)162从基础概念入手,介绍如何(批量)抓取(静态)网页数据,并保存为本地文件基础概念

网页(webpage)是存储在远程服务器上的HTML文件,是互联网上承载数据的核心载体163静态网页动态网页内容由开发者预编写内容由服务器端脚本实时生成所有元素结构、呈现形式和交互逻辑都包含在HTML文件中通过JavaScript实现内容呈现和交互功能,HTML作为脚本容器源码较长源码较短基础概念

网页示例164教育部985高校列表网页(静态网页,源代码共381行)某民宿网站首页(动态网页,源代码共126行)基础概念

统一资源定位符(UniformResourceLocator,URL)是互联网上资源的唯一地址,也被称为“网址”与文件路径类似,URL使用斜杠(/)表示目录的层次关系示例:/xxgk/lnlqfsx.htm165将URL转为文件名

通过自定义函数将URL编码为文件名

,以便将网页保存到本地Step1.将URL编码为字节数据:encode(‘utf-8’)Step2.对字节数据进行Base64编码:urlsafe_b64encode(url_bytes)Step3.将Base64字节解码为字符串:decode(‘utf-8’)Step4.移除可能存在的填充字符:rstrip(‘=’)166不同的URL需要对应不同的文件名。为便于数据溯源,要求能从文件名解码回URL文件名转为URL 通过自定义函数将文件名解码回原始URLStep1.文件名预处理,视情况添加填充字符:‘=’*paddingStep2.将文件名编码为字节数据:encode(‘utf-8’)Step3.对字节数据进行Base64解码:urlsafe_b64decode(base64_bytes)167URL与文件名互转

测试样例168当assert的表达式不成立时,会抛出AssertionError异常assert是调试代码的有效手段网页组成元素HTML定义网页的结构和内容CSS(CascadingStyleSheets,层叠样式)定义网页中元素的样式例如,颜色、尺寸等JavaScript(JS)赋予网页动态交互能力169第14讲(Streamlit)将介绍如何仅用Python编写网页程序课堂练习-3-2-1将复旦大学历年录取分数网站的URL转换为文件名,再将文件名还原为URL

/36333/list.htm170基础知识HTTP请求与响应客户端(Client):浏览器或Python程序,向服务器发送请求服务器(Server):存放网页的远程计算机,解析请求并发送响应请求(Request):客户端向服务器发送的“指令”,告知服务器需要什么内容响应(Response):服务器解析请求后,返回给客户端的“结果”,包含网页数据171HTTP请求与响应使用requests库发送HTTP请求

requests.get构建一个请求发向服务器返回requests.models.Response对象172安装命令pipinstallrequests“985工程”学校名单/srcsite/A22/s7065/200612/t20061206_128833.htmlHTTP请求与响应解读requests.get()的返回结果responsestatus_code状态码为200表示访问过程正常,否则访问异常2xx:success、3xx

redirection、4xxclienterror、5xxservererror173使用自动检测的编码,以免保存(中文)文本时出现乱码HTTP请求与响应尝试向不存在的URL发送请求网络通信过程中的不可控因素较多,可能导致通信失败使用try…except模块处理异常是良好的编程习惯174try:resp=requests.get('/',timeout=2)

print(resp.status_code)exceptExceptionase:

print(e)设置超时时间,避免请求长时间挂起基础知识网上数据伦理与Robots协议网站根目录下的robots.txt文件规定了哪些页面可以抓取爬虫程序应当严格遵守该协议的约定175抓取单个静态网页抓取一个特定静态网页并保存为本地的HTML文件定义一个页面下载类PageDownloader属性save_dir

#存放数据的路径方法process(self,target_url)crawl(self,url)save(self,response,filename)

176processtarget_urlcrawlsaveresponsefilename类方法之间调用(协作)示意抓取单个静态网页导入模块os,requests定义类PageDownloader类属性save_dir:数据存储目录。该属性值可在创建一个PageDownloader类对象时指定177import

osimport

requests

class

PageDownloader:

def

__init__(self,save_dir="html_pages"):

self.save_dir=save_dir

os.makedirs(self.save_dir,exist_ok=True)抓取单个静态网页类方法crawl:发送HTTP请求并获得response对象requests.get构建并发送请求raise_for_status状态码异常处理178def

crawl(self,url):

try:

response=requests.get(url,headers={"User-Agent":"Mozilla/5.0"})

response.raise_for_status()#状态码异常处理

return

response

except

requests.exceptions.RequestException

as

e:

print(f"[Error]获取页面失败:{e}")

return

None抓取单个静态网页类方法save:将response中的文本内容保存到本地HTML文件文件名filename通过调用之前的url_to_filename函数生成fw.write(response.text)将网页内容写入文件179def

save(self,response,filename):

try:

if

response.encoding.lower()=='none':#检测并设置正确的文本编码

response.encoding=response.apparent_encoding

with

open(filename,'w',encoding=response.encoding)as

fw:#保存内容

fw.write(response.text)

print(f"[Status]已保存到{filename}")

return

True

except

Exception

as

e:

print(f"[Error]保存页面失败:{e}")

return

False抓取单个静态网页类方法process:处理当前任务的统一接口crawl

发送请求save

保存网页内容180def

process(self,target_url):

print(f"[Status]开始抓取{target_url}")

response=self.crawl(target_url)

if

response

and

response.status_code==200:

filename=os.path.join(self.save_dir,url_to_filename(target_url)+'.html')

self.save(response,filename)

else:

response=None

message="成功"

if

response

else

"失败"

print(f"[Status]页面抓取{message}")

return

response抓取单个静态网页测试代码pd=PageDownloader()创建PageDownloader类对象cess(test_url)调用类方法process181"""测试代码"""test_url="/srcsite/A22/s7065/200612/t20061206_128833.html"pd=PageDownloader()pd.process(test_url)课堂练习-3-2-2用PageDownloader抓取复旦大学历年录取分数网页

/36333/list.htm182批量抓取静态网页互联网是一张以网页为节点的大网,节点之间通过超链接(hyperlink)的方式连接HTML源码中标签<a>的href属性指定了超链接网络爬虫(webcrawler)就是一个能够沿着这些“超链接”在互联网上自动“爬行”的程序它从一个或者多个初始URL出发,抓取页面内容,然后从页面中解析出新的URL,再继续抓取,如此循环183<a

href=“/”>网络爬虫工作过程爬虫把待处理的url放在工作队列task_queue中爬虫依次处理队列中的url,顺着网页把其他url添加到队列中当队列为空时,爬虫就会停止184网络爬虫的实现先导入必要的库185importtime,random,requestsfromurllib.parseimporturlparse,urljoinfrombs4importBeautifulSoupurlparse用来拆解和分析URLurljoin用来拼接和生成完整URL网络爬虫的实现定义Page

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论