
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨你正在阅读「Python 从零摸索日记」系列文章✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨弹简特 个人主页❄️个人专栏直通车软件测试入门记野生测试修炼手册 | APP 专项测试笔记接口测试从入门到跑路☕一个后端的 JavaEE 续命指南网络原理续命手册Python 从零摸索日记☕Java项目-轻聊☕Java项目-企悦抽✨靠热爱去书写自己靠勇敢去书写生活✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 博主简介:文章目录一、前言二、模块、包、库1、概念1.1 模块1.2 包1.3 库2、导入模块的常用方式2.1 方式1import 模块名2.2 方式2from 模块名 import 函数名/变量名2.3 方式3from 模块名 import *2.4 给模块或函数起别名as3、自定义模块的创建和导入3.1 创建自定义模块3.2 导入自定义模块4、自定义包的创建和导入4.1 创建包的结构4.2 导入包中的模块4.3 关于 __init__.py 的作用5、注意事项和常见错误5.1 命名规则5.2 导入路径问题5.3 循环导入5.4 import 和 from ... import ... 的区别三、异常处理1、什么是异常2、怎么捕获异常try-except-else-finally3、捕获特定类型的异常4、异常的传递四、文件操作1、操作文件的三个步骤2、文件的打开模式3、读取文件内容read, readlines, readline4、写入文件w 覆盖a 追加5、二进制文件操作图片、音频等6、文件常用操作删除文件、删除文件夹五、写在最后一、前言老铁们本文带你理清模块、包、库的层级关系掌握导入技巧、异常捕获与文件操作。从零实战轻松跨越新手进阶门槛。二、模块、包、库1、概念1.1 模块一句话解释一个.py文件就是一个模块。模块里可以写变量、函数、类等。生活类比模块就像一本“菜谱”的其中一页。这一页专门记录“鱼香肉丝”的做法变量、函数、类等。例子你新建一个文件叫tools.py里面写# tools.py 这个文件就是一个模块name计算器defadd(a,b):returnabdefmultiply(a,b):returna*b这个tools.py就是一个模块。1.2 包一句话解释一个包含多个.py模块的文件夹并且这个文件夹里必须有一个__init__.py文件可以是空的这个文件夹就叫做包。生活类比包就像一个“菜谱文件夹”里面有好多页模块每页一个菜。__init__.py就像文件夹的封面标记这是一个包。例子my_package/# 这是一个包文件夹__init__.py# 必须存在可以是空文件math_tools.py# 模块1string_tools.py# 模块21.3 库一句话解释库是一个更大的概念通常指多个包集合在一起提供一系列相关功能。比如 Python 标准库os、sys、random等、第三方库requests、numpy、pandas。生活类比库就像一个“大图书馆”里面有好多菜谱文件夹包还有很多其他功能的书。注意在口语中可能很多人会把“模块”、“包”、“库”混用但我们得要知道它们层级关系模块一个文件 包一个文件夹多个文件 库多个包2、导入模块的常用方式Python 有很多自带的模块标准库不需要安装直接import就能用。2.1 方式1import 模块名使用格式模块名.函数名()或模块名.变量名例子使用random模块生成随机数importrandom numrandom.randint(1,10)# 生成1到10之间的随机整数print(num)2.2 方式2from 模块名 import 函数名/变量名这样导入后可以直接用函数名不需要加模块名前缀。fromrandomimportrandint numrandint(1,10)# 直接写函数名print(num)导入多个方法或者变量from random import randint, choice, shuffle2.3 方式3from 模块名 import *导入模块中的所有内容不推荐容易命名冲突。fromrandomimport*numrandint(1,10)print(choice([苹果,香蕉]))2.4 给模块或函数起别名as当模块名太长或者你自己想换个名字用as取别名。importrandomasr numr.randint(1,10)# 用别名 rprint(num)也可以给函数起别名fromrandomimportrandintasri numri(1,10)print(num)注意原名randint失效只能用新名字ri。3、自定义模块的创建和导入3.1 创建自定义模块假设在当前目录下新建一个文件mymodule.py里面写# mymodule.pyname张三defsay_hello():print(你好我是自定义模块的函数)3.2 导入自定义模块在同一目录下新建一个文件main.py然后导入mymodule方式1import 模块名importmymoduleprint(mymodule.name)# 输出张三mymodule.say_hello()# 输出你好我是自定义模块的函数方式2from 模块名 import 变量/函数frommymoduleimportname,say_helloprint(name)# 直接使用变量say_hello()# 直接调用函数方式3from 模块名 import *frommymoduleimport*print(name)say_hello()注意Python 导入模块时会执行模块中的代码比如打印语句、定义函数等。但一般模块里只放定义不放主动执行的代码除了测试。4、自定义包的创建和导入4.1 创建包的结构假设我们想创建一个包叫mypackage里面有两个模块module_a.py和module_b.py。步骤新建一个文件夹叫mypackage。在文件夹里新建一个空文件__init__.pyPython 识别包必须要有这个文件可以是空的。在文件夹里新建module_a.py和module_b.py。文件夹结构当前目录/ ├── main.py# 我们用来测试导入的文件└── mypackage/# 这是一个包├── __init__.py# 空文件├── module_a.py └── module_b.pymodule_a.py内容# module_a.pyname_a模块Adeffunc_a():print(我是模块A的函数)module_b.py内容# module_b.pyname_b模块Bdeffunc_b():print(我是模块B的函数)4.2 导入包中的模块在main.py中你可以用以下几种方式导入方式1导入整个模块需要加包名.模块名importmypackage.module_aprint(mypackage.module_a.name_a)mypackage.module_a.func_a()方式2from 包名 import 模块名frommypackageimportmodule_aprint(module_a.name_a)module_a.func_a()方式3from 包名.模块名 import 具体内容frommypackage.module_aimportname_a,func_aprint(name_a)func_a()方式4from 包名.模块名 import *frommypackage.module_aimport*print(name_a)func_a()4.3 关于__init__.py的作用__init__.py。它的作用告诉 Python 这个文件夹是一个包可以被导入。可以在里面写代码当你import mypackage时会自动执行。可以控制from mypackage import *会导入哪些模块通过定义__all__列表。通常我们初学者可以暂时只放一个空文件。5、注意事项和常见错误5.1 命名规则模块名、包名、变量名、函数名都要符合标识符命名规则字母、数字、下划线组成不能数字开头不能是关键字如if、for、import区分大小写。5.2 导入路径问题Python 查找模块的路径包括当前脚本所在目录环境变量PYTHONPATH标准库路径第三方库安装路径如果自定义模块不在当前目录需要添加路径或用相对导入以后讲。5.3 循环导入不要出现a.py导入b.py同时b.py又导入a.py会导致错误。例如5.4import和from ... import ...的区别import 模块名需要写模块名.xxx不会污染当前命名空间。from 模块名 import xxx直接使用xxx但如果有同名变量会覆盖。推荐一般用import 模块名更清晰只导入少数常用函数时可以用from ... import ...。三、异常处理1、什么是异常一句话解释你写的代码在运行时发生了错误比如变量没定义、除以零、文件不存在Python 就会“抛出一个异常”程序会崩溃并打印一堆红色错误信息。生活类比你让朋友去拿“冰箱里的蛋糕”但冰箱里根本没有蛋糕。朋友就会回来跟你说“没有蛋糕啊”——这个“没有蛋糕”就是异常。最简单的异常例子print(a)# a 这个变量没定义过运行后你会看到类似这样的信息Traceback异常追溯告诉你错误发生的路径。File xxx, line 1哪个文件的第几行。NameError: name a is not defined异常类型和具体原因。这些异常信息构造就是告诉你异常信息包括执行路径、文件行号、错误类型和原因。看懂这些信息就能快速定位 bug。2、怎么捕获异常try-except-else-finally如果你的程序可能因为用户输入错误、文件不存在等发生异常你不想让程序崩溃而是想“优雅地处理”这个错误比如提示用户重新输入这时就用try...except。基本结构try:# 这里放可能会出错的代码except:# 如果 try 中出了异常就执行这里的代码程序不会崩溃else:# 如果 try 中没有出异常就执行这里的代码可选finally:# 不管有没有异常最后都会执行这里的代码可选常用于关闭文件、释放资源例如try:print(开始尝试执行代码)numint(input(请输入一个数字))# 如果用户输入的不是数字会触发 ValueErrorresult10/num# 如果用户输入 0会触发 ZeroDivisionErrorprint(计算结果是,result)except:print(出错了可能是输入的不是数字或者除以了零。)else:print(没有发生异常恭喜)finally:print(不管有没有异常我都会执行。)执行情况模拟用户输入5正常→ 输出开始尝试执行代码 计算结果是 2.0 没有发生异常恭喜 不管有没有异常我都会执行。用户输入0除以零→ 输出开始尝试执行代码 出错了可能是输入的不是数字或者除以了零。 不管有没有异常我都会执行。用户输入abc不是数字→ 输出类似上面。关键点try中一旦发生异常立刻跳转到excepttry中剩余代码不再执行。except只捕获异常不解决异常根源只是让你有机会做补救措施比如提示重新输入。else只有在try完全没异常时才执行。finally无论如何都执行非常适合做清理工作比如关闭文件。3、捕获特定类型的异常上面的except:会捕获所有异常但有时候你想针对不同异常做不同处理可以写多个except。try:numint(input(输入数字))result10/numexceptValueError:print(你输入的不是合法数字)exceptZeroDivisionError:print(不能除以零)exceptExceptionase:# 捕获其他所有异常e 是异常对象print(未知错误,e)else:print(结果是,result)finally:print(结束)建议写代码时先不要加try先让程序崩溃看清楚是什么异常类型比如ValueError、ZeroDivisionError然后再用对应的except去捕获它。4、异常的传递一句话解释如果函数 A 调用函数 B函数 B 调用函数 C在 C 中发生了异常且没有捕获那么这个异常会一层一层往外传直到被某个try...except捕获如果一直没捕获程序就崩溃。例子deffunc1():print(func1 开始)func2()# 调用 func2deffunc2():print(func2 开始)print(x)# x 没定义会触发 NameErrordefmain():try:func1()exceptNameError:print(捕获到了 NameError程序没有崩溃)main()输出func1 开始 func2 开始 捕获到了 NameError程序没有崩溃关键点异常会沿着调用链往回传递直到被try...except接住。如果最外层也没接程序就崩溃并打印 Traceback那个红色错误信息。利用这个特性你可以在合适的地方统一处理异常而不是每个函数内部都写try。四、文件操作1、操作文件的三个步骤打开文件open(文件路径, 模式, encoding编码)读/写文件.read()、.write()、.readlines()等关闭文件.close()释放系统资源生活类比打开冰箱打开文件拿一瓶饮料读或写关上冰箱门关闭文件。不关门的话冰箱会一直耗电占用系统资源。2、文件的打开模式模式含义文件不存在时r只读默认报错FileNotFoundErrorw只写会覆盖原有内容创建新文件a追加在文件末尾写入创建新文件rb二进制只读图片、视频等报错wb二进制只写会覆盖创建新文件ab二进制追加创建新文件注意文本文件.txt一般指定encodingutf-8二进制文件图片、音频不能指定encoding。3、读取文件内容read,readlines,readline假设有一个test.txt文件内容为你好这里是 零基础学Python园地方法1.read()— 一次性读取全部内容字符串fileopen(text.txt,r,encodingutf-8)contentfile.read()print(content)# 输出两行文字file.close()方法2.readlines()— 一次性读取全部按行返回列表每行末尾有\nfileopen(text.txt,r,encodingutf-8)linesfile.readlines()print(lines)# 输出[你好这里是\n, 零基础学Python园地]# 去除换行符print(--*100)# 首先使用一个列表到时候存储去除换行之后的数据clean_lines[]# 遍历返回的linesforiinlines:clean_lines.append(i.strip())print(clean_lines)# 输出[你好这里是, 零基础学Python园地]file.close()方法3.readline()— 一次读取一行多次调用读取下一行fileopen(text.txt,r,encodingutf-8)line1file.readline()# 第一行line2file.readline()# 第二行print(line1,end)# 不额外加换行print(line2,end)file.close()注意.read()和.readlines()适合小文件大文件建议用循环.readline()或直接for line in file:。4、写入文件w覆盖a追加覆盖写入 (w)文件存在则清空原内容不存在则新建。fileopen(output.txt,w,encodingutf-8)file.write(第一行\n)# \n 表示换行file.write(第二行)file.close()追加写入 (a)在文件末尾追加内容不覆盖原有内容。fileopen(output.txt,a,encodingutf-8)file.write(\n新增的一行)file.close()5、二进制文件操作图片、音频等不能直接r或w去读写图片因为图片是二进制数据。要用rb读二进制和wb写二进制。例子复制图片接下来使用文件的读取加写入将这个文件拷贝一份到output目录下注意前提得先有output这个目录代码如下# 打开原图二进制读# 打开原图二进制读withopen(srcpic/1.jpg,rb)assrc:datasrc.read()# 写入新文件二进制写withopen(output/1_copy.jpg,wb)asdst:dst.write(data)解释疑问为什么第二个中可以使用第一个的局部变量只有函数、类、模块才会创建新的作用域。像with、if、for、while这些语句块不会创建独立的作用域。所以你在第一个 with 块里定义的变量 data其实是属于它所在的函数或全局作用域。第二个 with 块自然也能访问到它。结果什么是with open(...) as 变量:这叫“上下文管理器”它会在代码块执行完后自动关闭文件即使中间发生异常也会关闭。你就不需要手动写.close()了非常推荐使用。用法withopen(rap.txt,r,encodingutf-8)asf:contentf.read()# 这里文件已经自动关闭不需要 f.close()6、文件常用操作删除文件、删除文件夹需要导入os和shutil模块。删除文件os.remove(文件路径)删除空文件夹os.rmdir(文件夹路径)只能删空的删除非空文件夹递归删除慎用shutil.rmtree(文件夹路径)importosimportshutil# 删除单个文件os.remove(test.txt)# 删除空文件夹os.rmdir(empty_folder)# 删除非空文件夹危险删了找不回shutil.rmtree(not_empty_folder)注意shutil.rmtree非常危险没有回收站功能生产环境慎用。五、写在最后能坚持看到最后的朋友属实是真爱学编程了先歇会儿眼睛放松一下很多同学刚开始学Python都不知道它到底能干啥。还是简单跟大伙唠唠可以做自动化测试、写办公脚本解放双手、爬虫采集数据、做数据分析、开发小工具、甚至做简单后端和小游戏用途真的特别广。最后分享几句实在又走心的话送给正在学Python的你1. 慢慢来别着急代码不会辜负每一个愿意坚持敲键盘的人。2. 现在多学一点技能未来就多一份选择的底气。3. 与其原地迷茫焦虑不如从一行Python代码开始悄悄变强。4. 看似不起眼的日复一日终会在将来的某天让你看到坚持的意义。铁汁们~ 觉得内容有用的话麻烦点个赞、关注一波后续会持续更新Python入门、实战、自动化相关笔记咱们一起慢慢进阶。文章有哪里讲得不妥的欢迎评论区随时指正大家一起交流进步兄弟们咱们一起学好Python悄悄逆袭~~