组成:包(package)、module(模块)、function(方法)
方式 | 描述 | 调用模块内函数 | 使用模块内的类 |
---|---|---|---|
import 模块名1, 模块名2 或from 包名 import 模块名 |
导入这个模块 | 模块名.方法名(参数) | 模块名.类名 |
from 模块名 import 方法名1, 方法名2,类名 或from 包名.模块名 import 方法名,类名 |
导入模块内指定的方法(不是以模块导入,是将函数或类导入) | 方法名(参数) | 类名(参数) |
from 模块名 import * 或 from 包名.模块名 import * |
导入模块内所有函数和类 | 方法名(参数) | 类名(参数) |
注意: 同一个模块写多次,只被导入一次。import应该放在代码的顶端
maths.py的内容:
def add(num1, num2):
return float(num1) + float(num2)
def minus(num1, num2):
return float(num1) - float(num2)
class mats:
def multiply(self, num1, num2):
return float(num1) * float(num2)
def division(self, num1, num2):
return float(num1) / float(num2)
在maths.py同一目录下创建新的py文件,简单示例模块的导入方式
1、import 模块名
的方式
import maths
result = maths.add(34, 56)
print(result)
m = maths.mats()
result = m.multiply(4, 9)
print(result)
result = maths.mats.division(16, 4)
print(result)
result = maths.minus(78, 24)
print(result)
执行结果为:
90.0
36.0
4.0
54.0
2、from 模块名 import 方法名1, 方法名2, 类名
的方式
from maths import add, mats
result = add(34, 56)
print(result)
m = mats()
result = m.multiply(4, 9)
print(result)
result = mats.division(16, 4)
print(result)
# minus没有导入,所以执行时会报错
result = minus(78, 24)
print(result)
执行结果:
90.0
36.0
4.0
Traceback (most recent call last):
File "E:\hogwart\work\demo.py", line 13, in
result = minus(78, 24)
NameError: name 'minus' is not defined
3、from 模块名 import *
的方式
from maths import *
result = add(34, 56)
print(result)
result = minus(78, 24)
print(result)
m = mats()
result = m.multiply(4, 9)
print(result)
result = mats.division(16, 4)
print(result)
执行结果:
90.0
54.0
36.0
4.0
模块导入时,是按照了一定的路径去查找的,如果找到对应的模块,则导入,若按照路径还没找到,则会导入报错
查看当前系统导入模块的路径方法是sys.path
(需要导入python自带的库sys),sys.path
包含了 Python 解释器自动查找所需模块的路径的列表。
从sys.path可以看出,系统是先在当前模块所在目录查找对应模块,若没有找到,就去模块所在的项目根目录中开始找,然后再去python的系统库、动态库等(如果有虚拟环境,就是在虚拟环境中)中查找,最后在安装的第三方库(如果有虚拟环境,就是在虚拟环境中)中找,没有找到的话,就报错。
由于Python 解释器自动查找所需模块是有一定顺序的,在前面如果找到了,就直接导入,不会继续往后找,所以在顺序后面的模块可能会因为前面的路径存在同名模块导致被覆盖(即不被调用)的情况。
比如random是系统内置模块,在demo.py中使用如下
# E:\hogwart\work\demo2\demo.py
import random
print(random.randint(1, 100))
执行结果是返回1到100之间的随机整数
如果在 E:\hogwart\work (项目路径)下有个random.py文件时,demo.py就不会导入系统的random库,而是导入项目下的random.py。
E:\hogwart\work\random.py为空或无randint()时,执行demo.py文件结果如下:
Traceback (most recent call last):
File "E:\hogwart\work\demo2\demo.py", line 2, in
print(random.randint(1, 100))
AttributeError: module 'random' has no attribute 'randint'
E:\hogwart\work\random.py有randint且参数类型正确时,则正常调用E:\hogwart\work\random.py下的randint()
# E:\hogwart\work\random.py
def randint(num1, num2):
return f"诶,就是玩,不生成{num1}到{num2}之间的数"
执行结果:
诶,就是玩,不生成1到100之间的数
建议: 在起模块名时,尽量避免与系统内置模块一致。
分类 | 描述 |
---|---|
系统内置模块 | python自带的模块,不需要额外安装,需要导入 |
第三方的开源模块 | 别人开发的优秀的模块,需要自己安装,使用时需要导入 |
自定义模块 | 自己写的,需要导入 |
系统内置模块有sys、os、re、json、time
os是Operating System的简称
import os
# os.name:获取系统名称,nt代表window,posix代表linux
print(os.name)
print("--------------------分割线--------------------")
# os.environ:获取系统环境变量信息
print(os.environ)
print(type(os.environ))
print("--------------------分割线--------------------")
# os.getenv("PATH"):获取指定名称的环境变量信息
# os.getenv()实际上从os.environ里获取对应的信息
print(os.getenv("PATH"))
print("--------------------分割线--------------------")
# os.system("命令"):执行系统指令,比如dir是打印目录下的文件和目录信息
print(os.system("dir")) # window系统,执行dir命令,类似于linux的ls,即如果是linux系统的话,dir改成ls
执行结果为:
nt
--------------------分割线--------------------
environ({'ALLUSERSPROFILE': 'C:\\ProgramData', 'APPDATA': 'C:\\Users\\xiaoba\\AppData\\Roaming', 'COMMONPROGRAMFILES': 'C:\\Program Files\\Common Files', 'COMMONPROGRAMFILES(X86)': 'C:\\Program Files (x86)\\Common Files', 'COMMONPROGRAMW6432': 'C:\\Program Files\\Common Files', 'COMPUTERNAME': 'DESKTOP-KCJG508', 'COMSPEC': 'C:\\Windows\\system32\\cmd.exe', 'DRIVERDATA': 'C:\\Windows\\System32\\Drivers\\DriverData', 'HOMEDRIVE': 'C:', 'HOMEPATH': '\\Users\\xiaoba', 'IDEA_INITIAL_DIRECTORY': 'C:\\Users\\xiaoba\\Desktop', 'LOCALAPPDATA': 'C:\\Users\\xiaoba\\AppData\\Local', 'LOGONSERVER': '\\\\DESKTOP-KCJG508', 'NUMBER_OF_PROCESSORS': '8', 'ONEDRIVE': 'C:\\Users\\xiaoba\\OneDrive', 'ONEDRIVECONSUMER': 'C:\\Users\\xiaoba\\OneDrive', 'OS': 'Windows_NT', 'PATH': 'C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Windows\\System32\\OpenSSH\\;C:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C:\\Program Files\\Git\\cmd;C:\\py310\\Scripts\\;C:\\py310\\;C:\\Users\\xiaoba\\AppData\\Local\\Microsoft\\WindowsApps;;F:\\PyCharm Community Edition 2022.1.1\\bin;', 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC', 'PROCESSOR_ARCHITECTURE': 'AMD64', 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 142 Stepping 10, GenuineIntel', 'PROCESSOR_LEVEL': '6', 'PROCESSOR_REVISION': '8e0a', 'PROGRAMDATA': 'C:\\ProgramData', 'PROGRAMFILES': 'C:\\Program Files', 'PROGRAMFILES(X86)': 'C:\\Program Files (x86)', 'PROGRAMW6432': 'C:\\Program Files', 'PSMODULEPATH': 'C:\\Program Files\\WindowsPowerShell\\Modules;C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\Modules', 'PUBLIC': 'C:\\Users\\Public', 'PYCHARM COMMUNITY EDITION': 'F:\\PyCharm Community Edition 2022.1.1\\bin;', 'PYCHARM_HOSTED': '1', 'PYTHONIOENCODING': 'UTF-8', 'PYTHONPATH': 'E:\\hogwart\\work', 'PYTHONUNBUFFERED': '1', 'SESSIONNAME': 'Console', 'SYSTEMDRIVE': 'C:', 'SYSTEMROOT': 'C:\\Windows', 'TEMP': 'C:\\Users\\xiaoba\\AppData\\Local\\Temp', 'TMP': 'C:\\Users\\xiaoba\\AppData\\Local\\Temp', 'USERDOMAIN': 'DESKTOP-KCJG508', 'USERDOMAIN_ROAMINGPROFILE': 'DESKTOP-KCJG508', 'USERNAME': 'xiaoba', 'USERPROFILE': 'C:\\Users\\xiaoba', 'WINDIR': 'C:\\Windows', 'ZES_ENABLE_SYSMAN': '1'})
--------------------分割线--------------------
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\Git\cmd;C:\py310\Scripts\;C:\py310\;C:\Users\xiaoba\AppData\Local\Microsoft\WindowsApps;;F:\PyCharm Community Edition 2022.1.1\bin;
--------------------分割线--------------------
������ E �еľ��� �칫
�������� 000C-5DEC
E:\hogwart\work ��Ŀ¼
2022/08/28 18:21 .
2022/08/28 18:21 ..
2022/08/28 17:59 .idea
2022/08/20 15:47 demo2
2022/08/20 09:53 314 maths.py
2022/08/28 18:21 691 wen.py
2022/08/21 17:57 512 wen2.py
2022/08/20 14:43 __pycache__
3 ���ļ� 1,517 �ֽ�
5 ��Ŀ¼ 475,003,990,016 �����ֽ�
0
import os
# 获取当前所在目录 get current directory
print(type(os.getcwd()), os.getcwd())
print("-----------------------------")
# 切换目录 change directory
os.chdir("..") # ..表示返回到上一个目录
print(os.getcwd())
os.chdir("F:\\OBS")
print(os.getcwd())
print("-----------------------------")
# 列出当前目录下的所有文件
result = os.listdir()
print(type(result), "\n", result) # 若未传参数,则将os.getcwd()作为路径,获取该路径下的所有文件
print("****************")
print(os.listdir("D:\\报销"))
# 递归创建多级目录,若目录已存在,默认报错,若不想报错,可传入参数exist_ok=True
print("-----------------------------")
# 识别到os.getcwd的根目录是F,所以在F跟目录下创建hah文件夹,在hah目录下创建a文件夹
os.makedirs("\\hah\\a") # 若参数只有相对路径,则在当前目录(os.getcwd())下的根目录下递归创建多级目录
# D:\test目录已存在,所以这部分路径不用生成,识别到test目录下没有haha文件,则在test目录下创建haha文件夹,在haha文件夹创建完美文件夹
os.makedirs("D:\\test\\haha\\完美", exist_ok=True) # 若参数是绝对路径,则依照路径生成目录
print("-----------------------------")
# 删除空目录,被删目录若非空,则报错
os.rmdir("D:\\test\\haha\\完美") # 删除D:\test\haha目录下的,名称为"完美"的文件夹
print("-----------------------------")
# 重命名目录,若新名称的目录已经存在,则会报错
os.renames("D:\\test\\haha", "D:\\test1\\bili") # 将 D:\test\haha路径重名为D:\test1\bili,即test改名为test1,haha改名为bili
print("-----------------------------")
# 删除文件,若文件本身不存在时,会报错
os.remove("wen.txt") # 参数只是文件名时,删除当前路径os.getcwd()下的文件(wen.txt)
os.remove("D:\\data\\清风.docx") # 参数若是绝对路径时,按照绝对路径找到并删除对应文件(清风.docx)
执行结果为:
C:\py310\python.exe E:/hogwart/work/demo2/demo.py
E:\hogwart\work\demo2
-----------------------------
E:\hogwart\work
F:\OBS
-----------------------------
['obs-studio', 'OBS-Studio-27.2.4-Full-Installer-x64.exe', 'OBS-Studio-27.2.4-Full-x64.zip', 'wen.txt']
****************
['4月份加班.xlsx', '5月份加班.xlsx', '6月份加班.xlsx', '工作簿1.xlsx', '新建文本文档.txt', '清风']
-----------------------------
-----------------------------
-----------------------------
-----------------------------
import os
print(__file__) # 当前文件名(绝对路径)
# 返回绝对路径
result = os.path.abspath(".\\demo2\\demo.py")
print(type(result), "\nresult = ", result)
print("-------------------------------------------")
# 返回文件名
data = os.path.basename(result)
print("basename: ", type(data), data)
print("-------------------------------------------")
# 返回文件路径
dir_name = os.path.dirname(result)
print("dirname: ", type(dir_name), dir_name)
print("-------------------------------------------")
# 分割路径,返回文件路径和文件名的元组
data = os.path.split(result)
print("split: ", type(data), data)
print("-------------------------------------------")
# 拼接路径
data = os.path.join("E:", "hogwart", "work", "wen.py")
print("join: ", type(data), data)
print("-------------------------------------------")
# 判断路径是否存在
print(f"{result}路径存在:{os.path.exists(result)}")
print(os.path.exists("E:\\hogwart\\不存在"))
print("-------------------------------------------")
# 判断是否是目录
print(f"{result}是目录:{os.path.isdir(result)}")
print(f"{dir_name}是目录:{os.path.isdir(dir_name)}")
print("-------------------------------------------")
# 判断是否是文件
print(f"{result}是文件:{os.path.isfile(result)}")
print(f"{dir_name}是文件:{os.path.isfile(dir_name)}")
print("-------------------------------------------")
# 获取文件大小
size = os.path.getsize(result)
print(type(size), size)
执行结果:
E:\hogwart\work\wen.py
result = E:\hogwart\work\demo2\demo.py
-------------------------------------------
basename: demo.py
-------------------------------------------
dirname: E:\hogwart\work\demo2
-------------------------------------------
split: ('E:\\hogwart\\work\\demo2', 'demo.py')
-------------------------------------------
join: E:hogwart\work\wen.py
-------------------------------------------
E:\hogwart\work\demo2\demo.py路径存在:True
False
-------------------------------------------
E:\hogwart\work\demo2\demo.py是目录:False
E:\hogwart\work\demo2是目录:True
-------------------------------------------
E:\hogwart\work\demo2\demo.py是文件:True
E:\hogwart\work\demo2是文件:False
-------------------------------------------
66
sys模块是Python自带的内置模块,是与Python解释器交互的桥梁
import sys
# 返回Python解释器版本
print("version: ", type(sys.version), sys.version)
print("--------------------------------\n")
# 返回操作系统平台名称
print("platform: ", type(sys.platform), sys.platform)
print("--------------------------------\n")
# 返回外部向程序传递的参数(列表),即本地系统调用该模块时(python 模块名.py 参数1 参数2 参数3 餐数n),python后面的参数,第一个参数一定是模块名
# 如果是其他方法或函数调用了该函数,不属于外部向程序传递的参数,参数只显示被调用函数的模块的绝对路径
print("argv: ", type(sys.argv), sys.argv)
print("--------------------------------\n")
# 返回已导入的模块信息(字典)
print("modules: ", type(sys.modules), sys.modules)
print("--------------------------------\n")
# 返回导包的搜索路径列表(列表)
print("path: ", type(sys.path), sys.path)
sys.path.append("selenium")
print("增加了selenium后:", sys.path)
在命令行中执行该文件
PS E:\hogwart\work> python wen.py -a -b abc key=value
version: 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]
--------------------------------
platform: win32
--------------------------------
argv: ['wen.py', '-a', '-b', 'abc', 'key=value']
--------------------------------
modules: {'sys': , 'builtins': , '_frozen_importlib': , '_imp': , '_thread': , '_warnings':
, '_weakref': , '_io': , 'marshal': , 'nt': , 'winreg': , '_frozen_importlib_external': , 'time': , 'zipimport': , '_codecs': , 'codecs': , 'encodings.aliases': , 'encodings': , 'encodings.utf_8': , '_codecs_cn': , '_multibytecodec': , 'encodings.gbk': , '_signal': , '_abc': , 'abc': , 'io': , '__main__': , '_stat': , 'stat': , '_collections_abc': , 'genericpath': , 'ntpath
PS E:\hogwart\work> python wen.py -a -b abc key=value
version: 3.10.4 (tags/v3.10.4:9d38120, Mar 23 2022, 23:13:41) [MSC v.1929 64 bit (AMD64)]
--------------------------------
platform: win32
--------------------------------
argv: ['wen.py', '-a', '-b', 'abc', 'key=value']
--------------------------------
modules: {'sys': , 'builtins': , '_frozen_importlib': , '_imp': , '_thread': , '_warnings':
, '_weakref': , '_io': , 'marshal': , 'nt': , 'winreg': , '_frozen_importlib_external': , 'time': , 'zipimport': , '_codecs': , 'codecs': , 'encodings.aliases': , 'encodings': , 'encodings.utf_8': , '_codecs_cn': , '_multibytecodec': , 'encodings.gbk': , '_signal': , '_abc': , 'abc': , 'io': , '__main__': , '_stat': , 'stat': , '_collections_abc': , 'genericpath': , 'ntpath
': , 'os.path': , 'os': , '_sitebuiltins': , 'site': }
--------------------------------
path: ['E:\\hogwart\\work', 'C:\\py310\\python310.zip', 'C:\\py310\\DLLs', 'C:\\py310\\lib', 'C:\\py310', 'C:\\py310\\lib\\site
-packages']
增加了selenium后: ['E:\\hogwart\\work', 'C:\\py310\\python310.zip', 'C:\\py310\\DLLs', 'C:\\py310\\lib', 'C:\\py310', 'C:\\py310\\lib\\site-pa
ckages', 'selenium']
import sys
# sys.getdefaultencoding():获取系统的编码方式
code = sys.getdefaultencoding()
print("系统的编码方式: ", type(code), ", ", code)
print("接下来请输入内容,除非输入的是退出,否则会一直要输入内容")
for line in sys.stdin:
if line.strip() == "退出":
# sys.exit():退出运行(相当于结束程序的运行),默认参数是空字符串
sys.exit("正常退出")
执行结果为:
系统的编码方式: , utf-8
接下来请输入内容,除非输入的是退出,否则会一直要输入内容
我
123
退出
正常退出
dir()可查看模块内定义的所有名称,比如函数、变量、类和导入的其他模块、函数、变量和类等。即以列表形式返回模块内可用的内容
示例
from maths import *
var1 = 23
def fun1():
print("hello, world")
print("-------显示当前模块可用的定义-------")
# dir()没有入参时,默认为当前模块
print(dir())
print("\n-------显示sys模块可用的定义-------")
#dir()使用前,需要先导入模块
import sys
# dir()有入参时,依照系统的路径去寻找模块
print(dir(sys))
执行结果:
-------显示当前模块可用的定义-------
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'fun1', 'mats', 'minus', 'var1']
-------显示sys模块可用的定义-------
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_exceptions', '_current_frames', '_deactivate_opcache', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_git', '_home', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'orig_argv', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdlib_module_names', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions', 'winver']