目录
一.图像处理PIL模块
Image模块
Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。
convert:
将当前图像转换为其他模式,并且返回新的图像。
Mode
图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:
modes | 描述 |
---|---|
1 | 1位像素,黑和白,存成8位的像素 |
L | 8位像素,黑白 |
P | 8位像素,使用调色板映射到任何其他模式 |
RGB | 3× 8位像素,真彩 |
RGBA | 4×8位像素,真彩+透明通道 |
CMYK | 4×8位像素,颜色隔离 |
YCbCr | 3×8位像素,彩色视频格式 |
I | 32位整型像素 |
F | 32位浮点型像素 |
from PIL import Image
img = Image.open(r'1.jpg')
#获取图片类型,大小
print(img.format,img.size)
#保存图片
img.save('2.png')
#生成缩略图 里面参数是宽和高
img.thumbnail((100,200))
#图片转换
img2 = img.convert('F')
#显示图片
img.show()
img2.show()
二.时间相关的模块(熟练使用)
1.在python中表示时间的方式:
1.时间戳(timestamp):时间戳表示的是从1970年1月1日00:00:00,按秒计算偏移量
clock(),time()
格式化的时间字符串(了解)
字符串 | 含义 |
---|---|
%a | 本地简化的星期的名称 |
%A | 完整的星期的名称 |
%b | 简化的月份的名称 |
%B | 完整的月份的名称 |
%c | 本地对应的日期表示和时间表示 |
%d | 月内中的天数(0~31) |
%H | 24小时制小时数(0~23) |
%m | 月份(01~12) |
%M | 分钟数(00~59) |
%w | 星期(0~6) 星期天开始 |
元组:共有9中元素,返回的是struct_time的函数主要有gmtime(),localtime(),strptime()
索引 | 属性 | 值 |
---|---|---|
0 | tm_year(年) | 2018 |
1 | tm_mon(月) | 1~12 |
2 | tm_mday(日) | 0~31 |
3 | tm_hour(时) | 0~23 |
4 | tm_min(分钟) | 0~59 |
5 | tm_sec(秒) | 0~61 |
6 | tm_wday(weekday) | 0~6(0表示周日) |
7 | tm_yday(一年中的第几天) | 1~366 |
8 | tm_isdst(是否是夏令时) | 默认为-1 |
UTC :世界协调时间 】格林威治天文时间,世界标准时间
在中国UTC+8
#localtime():获取当前时间,返回struct_time格式返回
#获取当前的时间
import time
#1.time获取当前时间戳 使用场景:数据库存储时间一般整形
curtime = time.time()
print(curtime)
strtime = time.ctime()
print(strtime)
#格式化时间
t = time.strftime('%Y/%m/%d %H:%M:%S')
print(t)
#localtime返回当前元祖格式时间
local = time.localtime()
print(local)
print(local.tm_year,'-',local.tm_mon,'-',local.tm_mday,local.tm_hour)
#让程序睡一会 sleep()
print('1111')
time.sleep(3)
print('2222')
2.datetime
#获取当天的时间
now = datetime.datetime.now()
print(now)
#获取当前的日期
today = datetime.date.today()
print(today)
#案例.获取昨天的时间
def getYesDay():
#获取当天的时间
today = datetime.date.today()
#获取前一天的时间
oneday = datetime.timedelta(days=1)
yes = today - oneday
print(yes)
#调用函数
getYesDay()
3.获取日历相关的信息
#获取某个月的日历
# 格式:calendar.month(x,y)
#x:显示的年份
#y显示的月份
print(calendar.month(2019,11))
#设置日历的第一天
calendar.setfirstweekday(calendar.SUNDAY)
print(calendar.month(2019,11))
#获取某一年的日历:
# 格式:calendar.calendar(x)
#x:显示的年份
print(calendar.calendar(2019))
#打印出一个月日历
res = calendar.HTMLCalendar(calendar.SUNDAY)
print(res.formatmonth(2019,5))
#判断某年是否为闰年?
print(calendar.isleap(2019))
print(calendar.isleap(2020))
三.文件的操作
1.文件的打开
访问模式 | 说明 |
---|---|
w | 打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件 |
r | 以只读的方式打开一个文件,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错 |
a | 打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建一个新文件进行写入 |
r+ | 打开一个文件用于读写,文件的指针放在文件的开头位置 |
w+ | 打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件 |
a+ | 打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入 |
rb | 以二进制的方式打开一个文件用于只读,文件的指针将会在文件的开头位置,默认模式,如果文件不存在会报错 |
wb | 以二进制的格式打开一个文件只用于写入,如果该文件已经存在则将其覆盖,如果不存在,创建新文件 |
ab | 以二进制方式打开一个文件用于追加,如果该文件已经存在,文件的指针会放在文件的结尾,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入 |
rb+ | 以二进制的方式打开一个文件用于读写,文件的指针放在文件的开头位置 |
wb+ | 以二进制的方式打开一个文件用于读写,如果该文件已经存在将其覆盖,如果文件不存在,创建一个新文件 |
ab+ | 以二进制的方式打开一个文件用于读写,文件的指针放在文件的末尾位置,,即新的内容将会写入已有内容之后,如果文件不存在,如果文件不存在,创建以一个新文件进行写入 |
2.文件的关闭
使用函数:
close()
f = open("test.txt","w")
f.close()
注意:
作用,节省内存
3.文件的读写
3.1 写数据(write)
使用write()函数可以完成对文件写入内容
格式:
write(str)
#1.打开文件
f = open('text.txt','a')
# print(type(f))
#2.写入数据
# f.write('hello\n python\n php\n c\n vb\n asp.net\njava\nshell')
f.write('111\n333\n222')
#3.关闭文件
f.close()
w模式,将文件之前数据给清除掉,再重新写入
a模式,在文件之前字符后面继续增加写入
3.2 读取数据(read/readline/readlines)
1.read(num),如果传递参数num,读取数据的长度(单位字节),如果不传参数,读取文件所有数据
f = open('text.txt','r')
res = f.read(2)
print(res)
res2 = f.read(10)
print(res2)
#使用循环
for i in f:
print(i)
#总结:如果读取多次,下次读取是从上次读取结束的位置开始读取
2.readline返回字符串,每次读取一行
content = f.readline()
print(content)
content2 = f.readline()
print(content2)
#使用循环
for temp in f.readline():
print(temp)
"""
总结:每次读取一行,如果传参数,读取一行数据里面的长度
"""
3.readlines()每次读取一行内容,把每行内容当中列表里面元素,返回一个列表
content = f.readlines()
print(content)
i = 1
for temp in f.readlines():
print(i,temp)
i += 1
3.3 读取CSV文件
导入CSV模块 pdf 图片
import csv
def readCsv(path):
#定义列表接受读取到的数据
readList = []
with open(path,'r') as re:
read = csv.reader(re)
for r in read:
readList.append(r)
return readList
#调用函数
print(readCsv(r'C:\Users\1\Desktop\csv\000002.csv'))
3.4 写入csv数据
import csv
def writeCsv(path,data):
"""
:param path:写入数据的文件路径
:param data: 要写入到文件里数据
:return:
"""
with open(path,'w') as w:
write = csv.writer(w)
for writeRow in data:
write.writerow(writeRow)
#调用函数
path = 'D:\yaoming.csv'
writeCsv(path,[['1','2','3'],['4','5','6'],['7','8','9']])
3.5 文件的定位读写
定为:
通俗的讲就是找到一个位置
1.获取当前读写文件的位置
在读取文件的过程中,如果想知道当前的位置,
可以使用函数tell()来获取,是光标开始的位置
2.定位到某一个位置
如果在读写文件的过程中,需要从另外一个位置进行操作,可以使用seek()函数
格式:
seek(offset,from)
offset:偏移量
from:方向
0:表示文件的开头
1:表示当前位置
2:表示文件的末尾
#tell()函数获取读取当前的位置
f = open('text.txt','rb')
str = f.read(3)
print('读取的数据是:',str)
position = f.tell()
print('读取的位置是:',position)
str2 = f.read(5)
print('第二次读取的数据是:',str2)
position2 = f.tell()
print('第二次读取的位置是:',position2)
#seek设置读取位置 0开头 1当前位置 2文件的末尾
f.seek(1,1)
str2 = f.read(5)
print('第三次读取的数据是:',str2)
position2 = f.tell()
print('第三次读取的位置是:',position2)
如果使用r模式,只支持文件开头读取,不支持当前位置读取
可以使用rb模式 支持当前位置读取
3.6 文件的重命名
概述:
需要对文件进行重命名操作,python中有一个模块os模块----》文件的操作
有一个函数rename()可以完成对文件名的重新命名
格式:
rename(需要修改的文件名,新的文件名)
import os
# os.rename("test.txt","毕业论文.txt")
3.7 文件的删除(pass)
概述:
os模块中remove()可以完成对文件的删除操作
格式:
remove(待删除的文件名)
案例:
os.remove("毕业论文.txt")
四.文件夹的相关操作
1. 创建一个文件夹
概述:
使用os模块中mkdir()函数
格式:
mkdir(待创建的文件名)
案例:
import os
os.mkdir("张三")
2.获取当前的目录下所有文件
概述:
使用os模块中listdir()函数
格式:
listdir()
案例:
import os
print(os.listdir("./"))
3.删除文件夹
概述:
使用os模块中的rmdir()函数
格式:
rmdir(待删除的文件夹)
案例:
import os
os.rmdir("张三")
4.应用----批量修改文件名(重命名)
例如:网上批量下载电视剧,电视剧名称比较长,我想批量修改剧名
五.调试程序
理解: 当我们程序出现问题的时候,我们的解决方案该怎么去写
1.打印
def test(s):
n = int(s)
try:
print('>>>n=%d'%n)
return 10/n #n的值可能是0
print('>>>n=%d' % n)
except Exception as e: #打印错误描述的信息
print('原因是:',e)
def main():
test('1')
#调用函数
main()
print最大的坏处:调试完之后要删除
如果调试程序代码比较多,程序文件里会出现大量print,不安全
运行程序会产生垃圾数据
2.断言 assert
格式:assert expression
等价于:
if not expression:
raise AssertError
def test(s):
n = int(s)
assert n != 0,'0 is zero'
return 10/n
#调用函数
test('0')
n = 1
assert n != 0,'0 is zero'
assert isinstance('hello',str)
assert isinstance('hello',int)
assert 表达式 n!=0 应该返回True
它和print比较相似,不同之处会有一个打印提示信息
如果assert断言失败,程序本身也会抛出一个异常AssertionError
3.logging
把print替换logging,和assert相比,logging不会出现异常,而且可以输出到文件
模块
导入logging模块
import logging
import os
dir = 'log'
if dir not in os.listdir('./'):
os.mkdir(dir)
#添加一个配置
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
filename='./log/new.log',
filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
#a是追加模式,默认如果不写的话,就是追加模式
format=
'%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
#日志格式
)
s = '0'
n = int(s)
logging.info('n=%d'%n)
print(10/n)
总结:logging可以指定记录信息的级别 debug,info,wranning,error
如果指定info,debug不再起作用,如果指定wranning,debug,info不起作用
4.pdb
pdb是python中自带的模块
作用:
为python程序提供一种交互的源代码调试功能
模块
导入pdb模块
#案例:求两个数之和
import pdb
#求两个数之和
def add(a,b):
return a + b
def cal(a,b):
pdb.set_trace() #在可能出现错误的代码加上 程序执行到这里自动暂停进入调试环境
c = add(a, b)
print(c)
#调用函数
cal(3,6)
启动pdb方式:
DOS--->当前目录---》python -m pdb XXX.py
直接在pycharm中导入运行
命令 | 用途 |
---|---|
break 或则 b | 设置断点 |
continue/c | 继续执行程序,或者跳到下一个断点 |
next/n | 执行下一行 |
step/s | 进入函数 |
list/l | 查看当前的代码段 |
return/r | 执行代码直到从当前函数的返回 |
exit/q | 终止,退出 |
p/! | 打印变量的值 p c |
help/h | 帮助 |