获取当前 py 文件名
import os
file = 'test.py'
fname = os.path.basename(file)
print(fname)
#通过 basename() 这个方法,我们可以除去路径只获取文件名称
#如果识别不出来路径报错(转义的问题),在路径前面加上 r。(file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py')
file1 = r'C:\Users\15205\PycharmProjects\pachong\xpath\test1.py'
fname1 = os.path.basename(file1)
print(fname1) #显示的也只有文件名称,不显示路径
# os.path.abspath(filename) 获取完整的带文件名的绝对路径
获取当前 py 文件的工作目录
import os #导入 python 内置的功能模块
path = os.getcwd() #使用获取目录的方法,不需要传入参数,将该方法的返回值赋值给 path 变量
print(path) #打印出变量的值获取工作目录
# os.path.dirname() 方法通过带文件名的完整路径只获取父目录路径,与 os.path.basename() 相反
获取文件大小
import os
fname = 'test.py' #定义文件名称变量
size = os.path.getsize(fname) #调用 os 模块的子模块 path 中的 getsize() 方法
print(size) #返回的文件大小为字节数
文件路径的拼接(带文件名称的完整路径)
import os
fname = 'test.py'
fdir = os.getcwd()
fpath = os.path.join(fdir,fname)
print(fpath)
#这只是对文件名称和路径的拼接,并不一定要文件对象存在
判断文件是否存在
#判断文件是否存在,True/False
import os
file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py'
fname = os.path.exists(file)
print(fname)
判断是文件还是目录
#判断是否为文件
import os
file = r'C:\Users\15205\PycharmProjects\pachong\xpath\test.py'
flag = os.path.isfile(file)
print(flag)
#判断是否为目录
import os
filedir = r'C:\Users\15205\PycharmProjects\pachong\xpath'
flag = os.path.isdir(filedir)
print(flag)
如何创建和删除目录
import os
import time
path1 = 'work'
if os.path.exists(path1):
print("该目录已经存在")
else:
os.mkdir(path1)
time.sleep(6)
os.rmdir(path1)
print('删除目录成功')
如何删除指定的文件对象
import os
fname = 'car.py'
if os.path.exists(fname):
os.remove(fname)
else:
print('当前文件不存在')
获取指定目录的清单信息
import os
fdir = os.getcwd()
infos = os.listdir(dir)
print(infos)
计算指定目录下所有文件的总大小
import osfdir = os.getcwd()flist = os.listdir(fdir)fsize = 0for item in flist: if os.path.isfile(item): size = os.path.getize(item) fsize += sizeprint(fsize)# 单位字节
如何打开文件
file = open('le1.py', 'r', encoding='utf-8') # python3 内置方法,打开文件对象
print(file)
# 第一个参数:文件名
# 第二个参数:操作模式
# 第三个参数:编码格式
读取文件所有数据
file = open('le1.py', 'r', encoding='utf-8')
data = file.read()
print(data)
# 读取文件内容过后要释放文件对象,也就是释放其占用的操作系统资源
file.close()
上下文管理器对象
with open('test.py', 'r', encoding='utf-8') as file:
data = file.read()
print(data)
# 该方式会自动释放占用的文件资源,无需 file.close()
文件行数据读取
file = open('test.py', 'r', encoding='utf-8')
# 行数据初始值
line = 1
while line != '': # 行数据不为空
line = file.readline()
print(line.strip()) # strip() 去除自动换行
一次读取全部行数据
file = open('test.py', 'r', encoding='utf-8')
lines = file.readlines() # 区别于 readline
# print(type(lines)) # [第一行数据,第二行数据,第三行数据......]
# print(lines)
for line in lines:
print(line.strip())
如何写入数据
content = 'i love you' # 默认字符串类型,类型错误会报错fname = 'stroy.txt'with open(fname, 'w', encoding='utf-8') as file: file.write(content)# file.write(str(content)) # 强制转换成字符串类型
如何批量写入数据
content = ['i love you\n', 'what?\n', 'hehe\n']fname = 'story.txt'with open(fname, 'w', encoding='utf-8') as file: file.writelines(content)
如何追加数据
# 上面我们写入数据用的 'w' 操作类型会覆盖数据,下面举例如何追加数据('a')content = 'hello world'fname = 'stroy.txt'with open(fname, 'a', encoding='utf-8') as file: file.write(str(content))
解压缩
import zipfile # 引入压缩模块,内置模块,无需安装zf = zipfile.ZipFile('stroy.zip', 'r') # 通过管理器读取压缩文件zf.extractall('outf') # 指定压缩文件解压后存放的目录,这里为在当前目录创建一个 outf 目录zf.close() # 释放资源对象
如何读取压缩文件的信息
// 方法一import zipfilezf = zipfile.ZipFile('stroy.zip', 'r')zlist = zf.namelist() # 读取所有压缩文件的名称print(zlist) # 打印文件列表// 方法二import zipfilezf = zipfile.ZipFile('stroy.zip', 'r')zlist = zf.infolist() # 不仅包括文件名,还包含文件大小for info in zlist: print(info.filename, info.file_size)
目录资源的压缩
import zipfileimport globimport oszf = zipfile.ZipFile('inner.zip', 'w')path1 = glob.glob('outf/*') # 可使用绝对路径for name in path1: print(name) zf.write(name, os.path.basename(name))
前提
同一目录下存在很多不同类型的资源文件。
步骤
代码实现
import osimport shutil # 在 os 模块的基础上再次封装,功能更强大# 源文件的存在路径src_dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\resource'# 分类资源的存放路径dest_dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\classify'# 判断分类目录是否存在,不存在则创建if not os.path.exists(dest_dir): os.mkdir(dest_dir)# 分析源目录,判断资源类型files = os.listdir(src_dir)for item in files: # print(item),输出所有文件名 # 处理路径 src_path = os.path.join(src_dir, item) # 判断状态 if os.path.isfile(src_path): # 如果是文件,进入到代码块 # 判断文件资源的类型 ndir = item.split('.')[-1] desc_path = os.path.join(dest_dir, ndir) # 创建分类 if not os.path.exists(desc_path): # 如果分类目录不存在则创建 os.mkdir(desc_path) shutil.move(src_path, desc_path)
直接查找
from os import path
while True:
# 指定查找目录
dir = input("要在哪个目录下查找:").strip()
# 判断
if path.exists(dir) and path.isdir(dir):
break
else:
print("输入信息有误!")
# 确定查找目标(文件,目录)
dist = input("请输入要查找的目标名:")
# 拼接处理
rpath = path.join(dir, dist)
# 判断是否存在
if path.exists(rpath):
print("查找成功")
else:
print("查找失败")
# 本程序只能查找指定目录下的文件,那么如何查找指定目录中的目录中的文件呢?
步骤
设定指定目录,文件判断的目录结构
对该目录下所有的文件资源进行分析和对比
将重复多余的文件资源删除清理
代码实现
from pathlib import Path
from filecmp import cmp
dir = r'C:\Users\15205\PycharmProjects\pachong\xpath\test'
path1 = Path(dir)
if not path1.exists():
print('指定的目录不存在,请重新配置目录')
# test 存在,分析目录下所有的文件资源
plist = list(path1.glob('*'))
print(plist)
if len(plist) == 0:
print('指定目录为空,没有任何资源')
else:
# 需要对文件进行分析对比
flist = [file for file in plist if file.is_file()]
for m in flist:
for n in flist:
if m.exists() and n.exists() and m!=n:
# 对文件分析对比
if cmp(m, n):
# 表示存在多余的资源,删除多余的资源
m.unlink()
print('重复文件已经清理,感谢使用,再见!')
步骤
包装 path 对象
循环遍历所有图片
获取每一张图片并转换格式
代码实现
from pathlib import Path# 安装第三方库 pip install pillowfrom PIL import Image# 定义两个路径dir1 = r'C:\Users\15205\PycharmProjects\pachong\xpath\test'dir2 = r'C:\Users\15205\PycharmProjects\pachong\xpath\work'# 构造 Path 实例对象path1 = Path(dir1)path2 = Path(dir2)# 判断 work 目录是否存在if not path2.exists(): path2.mkdir()# 遍历 test 目录获取所有文件对象plist = list(path1.glob('*.jpg'))print(plist)# 获取 list 中的每一个文件对象for file in plist: # 转换图片格式 rpath = (path2/file.name).with_suffix('.png') # 保存文件对象 # 首先打开原始图片,然后保存新的图片 Image.open(file).save(rpath)print('所有图片已经转换为新的格式 *.png')
from pathlib import Path
import os
import shutil
import time
dir1 = r'C:\Users\zhou chang\PycharmProjects\pachong\Xpath\test'
dir2 = r'C:\Users\zhou chang\PycharmProjects\pachong\Xpath\work'
# 包装,创建实例对象
path1 = Path(dir1)
path2 = Path(dir2)
# 判断 work 目录,不存在则创建
if not path2.exists():
path2.mkdir()
plist = list(path1.glob('*'))
print(plist)
for p in plist:
with open(p, 'rb') as file:
info = os.stat(p)
# print(info)
t = str(time.localtime(info.st_ctime).tm_year) + str(time.localtime(info.st_ctime).tm_mon)
# print(t)
rpath = path2/t
if not rpath.exists():
rpath.mkdir()
# 按时间移动到新的目录下
# 处理新目录下文件的路径
rfile = rpath/p.name
# 移动文件
p.replace(rfile)
步骤
了解版本信息
查看版本信息
版本控制
获取 python 版本信息
import sysinfos = sys.version_infoprint(infos)info = infos[0]print(info)if info < 3: print('python 版本较低,当前版本为 %s.%s.%s' %(infos[0], infos[1], infos[2])) print('退出程序的执行') exit()else: print('继续执行 python3 版本程序')
思路
模块未安装错误
分析原因机制
倒推解决方案
程序自动检测控制
场景
import pyecharts # 运行报错,显示没有这个模块
原因:第三方功能库没有安装
解决方案:
方法一:pip install ***
方法二:pycharm 快捷安装
程序自动检测缺失的功能库,并执行安装
import os
cmd = 'pip install requests'
# pip38 install requests
os.system(cmd)
带上判断然后匹配下载
import os
try:
import pyecharts
except Exception as e:
print('检测到功能库没有安装,开始下载安装')
cmd = 'pip install pyecharts'
os.system(cmd)
思路
mysql 连接错误
异常捕获
自动开启服务
连接数据库
代码实现(通过打开一个子进程自动开启 mysql 服务)
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 适用于 windows10 安装 8.0 版本 mysql
# pip install pymysql
import pymysql
import subprocess # 内置模块
# 数据库信息配置
host = '127.0.0.1'
dbname = 'office'
user= 'root'
paw = 'lhn115023808'
# 连接数据库
try:
pymysql.connect(host=host, port=3306, db=dbname, user=user, passwd=paw)
except Exception as e:
# 对异常类型进行判断
if e.__class__.__name__=='OperationalError':
# mysql 服务未开启
cmd = 'net start mysql80' # mysql8.0 版本服务名为 mysql80
# 开启子进程,开启 mysql80 服务
subprocess.call(cmd)
# 连接 mysql 数据库
pymysql.connect(host=host, port=3306, db=dbname, user=user, passwd=paw
print('继续往后正常执行') # 模拟过程
# 可能会看到输出乱码,将 pycharm 编码格式改成 GBK
思路
场景引入
休眠功能
定时器
调度器
场景一:定时间隔重复完成任务
方法一:线程会阻塞
from datetime import datetime
import time
# 设计功能函数(打印输出时间信息)
def print_time(count):
# 做的任务
print(datetime.now().strftime("%Y:%m:%d %H:%M:%S")) # 年月日时分秒
time.sleep(count)
print('间隔%s打印输出' % count)
# 重复执行三次
for i in range(3):
print_time(6)
方法二:多线程
from datetime import datetime
from threading import Timer
def print_time():
# 做的任务
print(datetime.now().strftime("%Y:%m:%d %H:%M:%S")) # 年月日时分秒
for i in range(3):
# 参数:时间间隔 6 秒
inc = 6
# 创建定时器对象
t = Timer(inc, print_time) # 定时器对象
t.start()
print('我不是同步在执行')
场景二:定时定点重复完成任务
定时定点任务的设计
# pip install apscheduler
from datetime import datetime
from apscheduler.schedulers.blocking import BlockingScheduler
# 定制执行任务
def job():
print(datetime.now().strftime("%Y:%m:%d %H:%M:%S"))
# 创建调度器对象
scheduler = BlockingScheduler()
# 分配任务
scheduler.add_job(func=job, trigger='cron', day_of_week='0-6', hour='17', minute='40', second='00')
# 启动调度器
scheduler.start()
思路
程序打包意义:将程序和环境一起打包,没有 python 环境也可执行。
功能库安装:安装第三方功能库 pip install pyinstaller
打包程序设计
打包参数配置
编写简单程序并演示打包方法
设计简单程序
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# pip install pyinstaller
# python3.8 及以上的版本安装 pyinstaller 可能不会自动添加环境变量,还是无法使用
# 我的解决方法是将 pyinstaller.exe 复制到当前目录一份
import time
def job():
print('打包功能演示')
# 写程序入口函数
if __name__=='__main__':
job()
打包方法一:交互界面打包
在 cmd
里切换到 py 文件所在的路径
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E9bIQnKj-1643119894604)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124225532077.png)]
执行 pyinstaller -F run.py
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nwMPA6cq-1643119894605)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124230527323.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ju1gfiYX-1643119894606)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124230910450.png)]
点击这个 run.exe 会一闪而过,其实已经执行了。
修改一下代码,重新打包,验证一下。
import time
def job():
print('打包功能演示')
time.sleep(20) # 休眠 20 秒
# 写程序入口函数
if __name__=='__main__':
job()
pyinstaller -F run.py
新的包会覆盖老的包。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QAjPe7Iu-1643119894606)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124231326983.png)]
可以看到,正在执行。
打包方法二:手动打包写入到程序中
程序自动打包
import os
def main():
cmd = 'pyinstaller -F run.py'
os.system(cmd)
if __name__ == '__main__':
main()
执行脚本,查看输出和结果。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5n2lEH9G-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232112593.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7kUQWYW-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232128294.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QgVowIJ5-1643119894607)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124232211529.png)]
思路
第三方平台
注册账号
保存 id, token
设计脚本程序
具体实现
打开网页:https://www.yuntongxun.com,注册账号。
accid:8aaf07087e7b9872017e8cb6970002a4
acctoken:ec070071d417407591d44b66e79f97b3
appid:8aaf07087e7b9872017e8cb6980702ab
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9i9qO9Mz-1643119894608)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124233521217.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2RU5RoCp-1643119894608)(C:\Users\15205\AppData\Roaming\Typora\typora-user-images\image-20220124235403256.png)]
程序设计
# pip install ronglian-sms-sdk
# 导包过程
from ronglian_sms_sdk import SmsSDK
# 参数配置
accId = '8aaf07087e7b9872017e8cb6970002a4'
accToken = 'ec070071d417407591d44b66e79f97b3'
appId = '8aaf07087e7b9872017e8cb6980702ab'
# 设计函数(发送手机短信)
# 两个参数:手机号码;验证码及失效时间。
def send_sms(phone, datas):
# 创建实例化对象
sdk = SmsSDK(accId, accToken, appId)
tid = '1'
# 发送短信
resp = sdk.sendMessage(tid, phone, datas)
return resp
if __name__=='__main__':
# 配置参数
phone = '***********'
datas = ('123456', '3')
send_sms(phone, datas)
执行正常的话,你的手机应该收到验证码短信,验证码为 123456。
思路
PyPDF2 功能库(pip install PyPDF2
# 对中文支持不太好)
文件对象
获取文件页数
获取文件数据
文本文件:文本字符串的处理
file = open('test.py', 'r', encoding='utf-8')
print(type(file))
result = file.read()
print(result)
PDF文件:二进制格式数据的处理
import PyPDF2
# 获取文件对象
file = open('show.pdf', 'rb')
pdfrd = PyPDF2.PdfFileReader(file)
# 对象.属性名 获取页数
pages = pdfrd.numPages
# print(pages)
index = int(input('请输入对应的页数(从0开始):'))
if index < pages:
page = pdfrd.getPage(index)
result = page.extractText()
print(result)
else:
print('页数不存在,请确认!')
思路
加密状态
PDF 解密
判断 pdf 文件是否加密
import PyPDF2
def is_pwd(fname):
pdfobj = open(fname, 'rb')
pdfrd = PyPDF2.PdfFileReader(pdfobj)
# 开始判断属性(加密?) 对象.属性
if pdfrd.isEncrypted:
print(f'{fname} 是加密状态')
else:
print(f'{fname} 没有加密')
if __name__ == "__main__":
fname = 'show.pdf'
is_pwd(fname)
对加密 pdf 文件数据的提取
import PyPDF2
def de_pwd(fname, pwd):
pdfobj = open(fname, 'rb')
pdfrd = PyPDF2.PdfFileReader(pdfobj)
if pdfrd.isEncrypted:
print('开始进行解密处理:')
result = pdfrd.decrypt(pwd)
if result:
page = pdfrd.getPage(1)
content = page.extractText()
print(content)
else:
print('抱歉,解密失败了!')
else:
print(f'{fname} 是没有加密的状态')
if __name__=='__main__':
fname = 'show.pdf'
pwd = '*******'
de_pwd(fname, pwd)
// 如果无法解密,检查密码是否错误。还有一种可能是 PyPDF2 这个模块的问题,这个模块很老了,快要放弃维护,参考:https://blog.csdn.net/weixin_39278265/article/details/84799843
思路
单页转存
多页转存
加密转存
将一个 PDF 第二页的内容转存到一个新的文件中
def single_page(fname, new_file, index):
import PyPDF2
# 打开原有的 PDF 文件
pobj = open(fname, 'rb')
# 构造 reader 对象
pdfrd = PyPDF2.PdfFileReader(pobj)
# 获取对应的 page 对象
page = pdfrd.getPage(index)
# 写入数据
pdfwr = PyPDF2.PdfFileWriter()
# 添加 page 对象
pdfwr.addPage(page)
# 创建新的 PDF 文件
pdfout = open(new_file, 'wb')
# 核心的一步,转存 pdf 内容
pdfwr.write(pdfout)
# 释放文件资源
pobj.close()
pdfout.close()
if __name__=="__main__":
fname = 'old.pdf'
new_file = 'new.pdf'
index = 1
single_page(fname, new_file, index)
// 如果报错可能是 PyPDF2 模块的问题
将所有的页数全部转存并加密
def all_page_encrypt(fname, new_file):
import PyPDF2
pobj = open(fname, 'rb')
pdfrd = PyPDF2.PdfFileReader(pobj)
pdfwr = PyPDF2.PdfFileWriter()
pages = pdfrd.numPages
for index in range(pages):
pdfwr.addPage(pdfrd.getPage(index))
pdfwr.encrypt('999999')
pdfout = open(new_file, 'wb')
pdfwr.write(pdfout)
pobj.close()
pdfout.close()
if __name__=="__main__":
fname = 'old.pdf'
new_file = 'new1.pdf'
all_page_encrypt(fname, new_file)