天天看点

模块和文件

一、模块

1.什么叫模块

模块英文为Modules,一个模块中可以包含N多个函数,在python中一个扩展名为.py的文件就是一个模块

模块的优点:方便其他程序和脚本的导入并使用;避免函数名和变量名冲突;提高代码的可维护性;提高代码的可重用性

#多个模块构成python程序
#模块中包含函数
def fun():
    pass
def fun2():
    pass
#模块中包含类
#类中包含类属性,类方法,静态方法,实例属性
class Student():
    native_place='吉林'#类属性
    def eat(self,name,age):
        self.name=name
        self.age=age
    @classmethod
    def cm(cls):
        pass
    @staticmethod
    def sm():
        pass
#模块中包含语句
a=10
b=20
print(a+b)
           

2.自定义模块

创建模块:新建一个.py文件,名称尽量不要与Python自带的标准模块名称相同

导入模块:import 模块名称 [as别名]

from 模块名称 import 函数/变量/类

import math
print(math,id(math),type(math),math.pi)
print(dir(math))
print(math.pow(2,3),type(math.pow(2,3)))#8.0 <class 'float'>
print(math.ceil(9.001))#10
print(math.floor(9.9999))#9
           
from math import pi
from math import pow
print(pi)#3.141592653589793
print(pow(2,3))#8.0 
           

新建python文件calc.py

def add(a,b):
    return a+b
def div(a,b):
    return a/b
           

在其他python文件所在的文件夹上单击右键出现“Mark Directory as”,选择“Sources Root”后就可以导入calc模块

#第一种导入
import calc
print(calc.add(10,20))
print(calc.div(10,4))
#第二种导入
from calc import add
from calc import div
print(add(10,20))
print(div(10,4))
           

3.以主程序的形式执行

在每个模块的定义中都包括一个记录模块名称的变量__name__,程序可以检查该变量,以确定它们在哪个模块中执行。如果一个模块不是被导入到其他程序中执行,那么它可能在解释器的顶级模块中执行。顶级模块的__name__变量的值为__main__

if name=‘main’:

pass

新建python文件calc2.py

def add(a,b):
    return a+b
print(add(10,20))
           

在其他文件中导入模块calc2

import calc2
print(calc2.add(100,200))#发现calc2.py中的print(add(10,20))也输出了结果
           

所以calc2改为

def add(a,b):
    return a+b
if __name__ == '__main__':#输入main回车
    print(add(10,20))#只有当点击运行calc2时,才会执行这步运算
           

4.python中的包

包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下,用于规范代码和避免模块冲突

包和目录的区别:包含__init__.py文件的目录称为包

目录中通常不包含__init__.py文件

包的导入:import 包名.模块名

新建包:在python文件所在的文件夹上单击右键出现“New”,选择“Python Package”就可以新建一个包

在包中新建模块moduleA和moduleB,在moduleA中写a=10,在moduleB中写b=100

然后在其他Python文件中写代码

import pageage1.module_A
print(pageage1.module_A.a)

import pageage1.module_A as ma#ma是pageage1.module_A这个模块的别名
print(ma.a)
           
#导入含有包的模块时的注意事项
import pageage1
import calc
#使用import方式进行导入时,只能跟包名或模块名
from pageage1 import module_A
from pageage1.module_A import a
#使用from……import方式进行导入时,可以导入包、模块、函数、变量
           

python中常用的内置模块

模块名 描述
sys 与python解释器及其环境操作相关的标准库
time 提供与时间相关的各种函数的标准库
os 提供了访问操作系统服务功能的标准库
calendar 提供与日期相关的各种函数的标准库
urllib 用于读取来自网上(服务器)的数据标准库
json 用于使用JSON序列化和反序列化对象
re 用于在字符串中执行正则表达式匹配和替换
math 提供标准算术运算函数的标准库
decimal 用于进行精确控制运算精度、有效位数和四舍五入操作的十进制运算
logging 提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能
import sys
print(sys.getsizeof(24))#28
print(sys.getsizeof(45))#28
print(sys.getsizeof(True))#28
print(sys.getsizeof(False))#24
import time
print(time.time())#625478159.7243931
print(time.localtime(time.time()))#time.struct_time(tm_year=2021, tm_mon=7, tm_mday=5, tm_hour=17, tm_min=42, tm_sec=39, tm_wday=0, tm_yday=186, tm_isdst=0)
import urllib.request
print(urllib.request.urlopen('http://www.baidu.com').read())
import math
print(math.pi)
           

5.第三方模块的安装及使用

pip install 模块名

键盘的“windows”+"r"同时按,输入cmd,回车,输入pip install schedule

输入python,回车,输入import schedule回车,如果不报错说明安装成功了

import schedule
import time
def job():
    print('哈哈')
schedule.every(3).seconds.do(job)
while True:
    schedule.run_pending()
    time.sleep(1)
           

import 模块名

二、文件

1.编码格式

常见的字符编码格式:Python的解释器使用的是Unicode(内存),.py文件在磁盘上使用UTF-8存储(外存)

模块和文件

在python文件最上面添加一行encoding=gbk可以改变默认存储为GBK

不同的编码方式的存储空间是不同的

2.文件的读写原理

文件的读写称为"IO操作"(先进先出)

文件读写操作流程:Python操作文件—>打开或新建文件—>读写文件—>关闭资源

3.文件读写操作

内置函数open()创建文件对象,通过IO流将磁盘文件中的内容与程序中的对象中的内容进行同步

file=open(filename[,mode,encoding])

file:被创建的文件对象

open:创建文件对象的函数

filename:要创建或打开的文件名称

mode:打开模式默认为只读

encoding:默认文本文件中字符的编写格式为gbk

file=open('a.txt','r')#读取格式是一个列表
print(file.readlines())
file.close()
           

常见的文件打开模式

按文件中数据的组织形式,文件分为文本文件(存储的是普通“字符”文本,默认为unicode字符集,可以使用记事本程序打开)和二进制文件(把数据内容用“字节”进行存储,无法用记事本打开,必须用专用的软件打开,如mps音频文件、jpg图片、doc文档等)

打开模式 描述
r 以只读模式打开文件,文件的指针将会放在文件的开头
w 以只写模式打开文件,如果文件不存在则创建,如果文件存在则覆盖原有内容,文件的指针放在文件的开头
a 以追加模式打开文件,如果文件不存在则创建,文件的指针放在文件的开头;如果文件存在,则在文件末尾追加内容,文件指针在原文件末尾
b 以二进制模式打开文件,不能单独使用,需要与其它模式一起使用,rb或者wb
+ 以读写方式打开文件,不能单独使用,需要与其它模式一起使用,a+
file=open('b.txt','w')
file.write('hello,world')
file.close()
file=open('b.txt','w')
file.write('python')
file.close()

file=open('b.txt','a')
file.write('python')
file.close()

src_file=open('logo.png','rb')
target_file=open('copylogo.png','wb')
target_file.write(src_file.read())
target_file.close()
src_file.close()
           

4.文件对象常用的方法

方法名 说明
read([size]) 从文件中读取size个字节或字符的内容返回。若省略[size],则读取到文件末尾,即一次读取文件所有内容
readline() 从文本文件中读取一行内容
readlines() 把文本文件中每一行都作为独立的字符串对象,并将这些对象放入列表返回
write(str) 将字符串str内容写入文件
writelines(s_ list) 将字符串列表s_ list写入文本文件,不添加换行符
seek(offset[, whence]) 把文件指针移动到新的位置,offset表示相对于whence的位置:offset:为正往结束方向移动,为负往开始方向移动。whence不同的值代表不同含义:0:从文件头开始计算(默认值)1: 从当前位置开始计算2: 从文件尾开始计算
tell() 返回文件指针的当前位置
fiush() 把缓冲区的内容写入文件,但不关闭文件
close() 把缓冲区的内容写入文件,同时关闭文件,释放文件对象相关资源
file=open('a.txt','r')
print(file.read(2))
print(file.readline())
print(file.readlines())
           
file=open('a.txt','a')
file.write('hello')
file.close()

file=open('a.txt','a')
lst=['java','go','python']
file.writelines(lst)
file.close()
           
file=open('a.txt','r')
file.seek(2)
print(file.read())
print(file.tell())
file.close()
           
file=open('c.txt','a')
file.write('hello')
file.flush()
file.write('world')
file.close()
           

5.with语句(上下文管理器)

with语句可以自动管理上下文资源,不论什么原因跳出with块,都能保证文件正确的关闭,以此来达到释放资源的目的

模块和文件
#print(type(open('a.txt','r')))
with open('a.txt','r') as file:
    print(file.read())
           
#MyContenMgr实现了特殊方法__enter__()、__exit__(),称为该类对象遵守了上下文管理器协议
该类对象的实例对象,称为上下文管理器
class MyContenMgr(object):
    def __enter__(self):
        print('enter方法被调用执行了')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit方法被调用执行了')
    def show(self):
        print('show方法被调用执行了')
with MyContenMgr() as file:#相当于file=MyContenMgr()
    file.show()
           
with open('logo.png','rb') as src_file:
    with open('copy2logo.png','wb') as target_file:
        target_file.write(src_file.read())
           

6.目录操作

os模块是Python内置的与操作系统功能和文件系统相关的模块,该模块中的语句的执行结果通常与操作系统有关,在不同的操作系统上运行,得到的结果可能不一样。

os模块与os.path模块用于对目录或文件进行操作

#os模块与操作系统相关的一个模块
import os
os.system('notepad.exe')
os.system('calc.exe')
#直接调用可执行文件
os.startfile('C:\\Program Files\\Tencent\\QQ\\Bin\\qq.exe')
           
函数 说明
getcwd() 返回当前的工作目录
listdir(path) 返回指定路径下的文件和目录信息
mkdir(path[, mode]) 创建日录
makedirs(path1/path2. … [, mode]) 创建多级目录
rmdir(path) 删除日录
removedirs(path1/path2…) 删除多级目录
chdir(path) 将path设置为当前工作目录
import os
print(os.getcwd())
lst=os.listdir('../chap15')
print(lst)
os.mkdir('newdir2')
os.makedirs('A/B/C')
os.rmdir('newdir2')
os.removedirs('A/B/C')
os.chdir('E:\\vippython\\chap14')
print(os.getcwd())
           

os.path模块操作目录相关函数

函数 说明
abspath(path) 用于获取文件或目录的绝对路径
exists(path) 用于判断文件或目录是否存在,如果存在返回True,否则返回False
join(path, name) 将目录与目录或者文件名拼接起来
splitext() 分离文件名和扩展名
basename(path) 从一个目录中提取文件名
dirname(path) 从一个路径中提取文件路径,不包括文件名
isdir(path) 用于判断是否为路径
import os.path
print(os.path.abspath('demo13.py'))
print(os.path.exists('demo13.py'),os.path.exists('demo18.py'))
print(os.path.join('E:\\Python','demo13.py'))
print(os.path.split('E:\\vippython\\chap15\\demo13.py'))
print(os.path.splitext('demo13.py'))
print(os.path.basename('E:\\vippython\\chap15\\demo13.py'))
print(os.path.dirname('E:\\vippython\\chap15\\demo13.py'))
print(os.path.isdir('E:\\vippython\\chap15\\demo13.py'))
           
#列出指定目录下的所有.py文件
import os
path=os.getcwd()
lst=os.listdir(path)
for filename in lst:
    if filename.endswith('.py'):
        print(filename)
           
import os
path=os.getcwd()
lst_files=os.walk(path)
for dirpath,dirname,filename in lst_files:
    print(dirpath)
    print(dirname)
    print(filename)
           
import os
path=os.getcwd()
lst_files=os.walk(path)
for dirpath,dirname,filename in lst_files:
    for dir in dirname:
        print(os.path.join(dirpath,dir))
    for file in filename:
        print(os.path.join(dirpath,file))