01 02 2020

1、字符串

"hello"+" "+"world"         # 连接字符串    输出 hello world
"hello" * 5                 # 复制字符串  输出   'hellohellohellohellohello'
print(len("hello world"))   # 获取字符串的长度    输出   11
"hello".upper()             # 将字符串转化为大写  输出 HELLO   
'HELLO'.lower()             # 将字符串转化为小写  输出 hello
"hello".islower()           # 判断字符串是否全为小写  若是  返回True
.isupper()                  # 判断字符串是否全为大写  若是  返回True
.isalpha()                  # 字符串只包含字母并且非空  返回True
.isalnum()                  # 字符串只包含字母或数字并且非空  返回True
.isdecimal()                # 字符串只包含数字并且非空  返回True
.istitle()                  # 字符串已大写字母开头后面全是小写字母   返回True
.startswith('hello')        # 判断字符串是否是以某个字符串开头  若是  返回True
.endswith('world')          # 判断字符串是否是以某个字符串结尾  若是 返回True
",".join(['cats', 'rats', 'bats'])    # 输出'cats,rats,bats'  将数组内元素以某个字符拼接成字符串
'cats,rats,bats'.split(',') # 输出 ['cats', 'rats', 'bats']   将字符串分割为数组,默认以空格分割
"hello".rjust(20, "*")      # 输出 ***************hello  指定长度,原字符串不够,左边填充字符* ,第二个参数可选 默认空格填充
"hello".ljust(20, "*")      # 输出 hello***************  指定长度,原字符串不够,右边填充字符* ,第二个参数可选 默认空格填充
"hello".center(20, "*")     # 输出 *******hello********   指定长度,原字符串不够,左右填充字符* ,第二个参数可选 默认空格填充
" hello ".strip()           # 删除两边的空格,可传参,表示删除两边指定字符,字符与顺序无关  如 strip('1234') 和 strip('4231') 一样
" hello ".lstrip()          # 删除左边的空格
" hello ".rstrip()          # 删除右边的空格 

pyperclip 模块               # 与计算机自身的拷贝粘贴关联
import pyperclip
pyperclip.copy('hello world')    # 设置计算机自身拷贝的内容
pyperclip.paste()                # 粘贴输出计算机拷贝的内容


2、数组列表

arr = ['1', '2', '3', '4', '5']
print(arr[-1])        # 负数下标 输出 5
print(arr[1:4])       # 数组切片 ['2', '3', '4'] 输出 下标是1-4的值
print(arr[0:-1])      # ['1', '2', '3', '4']  输出  下标0到-1 之间的值   -1相当于len(arr)-1
print(arr[:2])        # ['1', '2']  输出  下标 0-2的值
len(arr)              # 数组长度  输出 5
del  arr[1]           # 删除数组元素  输出   ['1', '3', '4', '5']
'1' in arr            # True   判断值是否在数组中
'1' not in arr        # False   
num1, num2, num3, num4 = arr   #多重赋值,4个变量对应数组内的值,变量的数量必须和数组长度相等
arr.index('3')        # 输出1   获取 值在数组内下标
arr.appent('6')       # 在数组最后一位添加值
arr.insert(1, '2')    # 在数组下标1的地方插入一个值
arr.remove('2')       # 根据值去删除元素  删除前最好先用 in 判断是否在数组中
arr.sort()            # 对数组排序  正序    arr.sort(reverse=True)  倒序
tuple(arr)            # 将数组转化为tuple , tuple 是不可变数组, 数组内元素不可改变
list(tuple)           # 将tuple 转成一个可变数组
range()               # 可传3个参数
for(i in range(5)):
    print(i)    # 0 1 2 3 4      
for(i in range(3, 5)):
    print(i)    # 3 4 
for(i in range(0, 10, 2)):
    print(i)    # 0 2 4 6 8
列表推导式
n_list = [x ** 2 for in range(10) if x%2 == 0]
等价于
n_list=[]
for x in range(10)
    if x % 2 == 0:
        n_list.append(x ** 2)


3、json 字典

jsonStr = {'color': 'red', 'age': 24}
jsonStr.values()           # 获取值, 输出   ['red', 24]
jsonStr.keys()             # 获取键,输出  ['color', 'age']
jsonStr.items()            # 获取键值对,输出  [('color', 'red'), ('age', 24)]
jsonStr.get('age', 3)      # 根据键获取值,输出 24,第二个参数是如果键值不存在返回的默认值
jsonStr.setdefault('name', 'zhaowenbin')   # 设置json键值  输出 zhaowenbin  第一个参数是键名,第二个参数是要设置的值,如果键存在,返回存在的值,否则会给json添加一个新的键值并返回设置的值


4、正则匹配

import re
numRegex = re.compile('\d+')   # 实例化一个Regex对象 compile 可传第二个参数  re.DOTALL  匹配所有字符包括换行   re.I  不区分大小写  
mo = numRegex.search('jcjcl123mckdsc456')   #匹配字符串(单匹配)
mo.group()  # 获取匹配到的值,输出123
或
numRegex.findall('jcjcl123mckdsc456')   #多匹配 输出 ['123','456']
替换字符串
numRegex.sub('000', 'jcjcl123mckdsc456')  #输出 jcjcl000mckdsc000  第一个参数是替换的字符串, 第二个参数是被替换的字符串


5、文件操作

import os
os.path.join('usr', 'bin', 'spam')  # 将字符拼接成路径 输出 'usr/bin/spam'
os.getcwd()    # 获取当前目录  输出  /Users/echo
os.chdir('/Library/WebServer/Documents')     # 将当前目录设置为
os.makedirs('/Library/WebServer/Documents')  # 创建文件夹 会递归创建所有不存在的文件夹
os.path.abspath('./Documents')   # 根据相对路径返回绝对路径
os.path.isabs(path)   # 判断是否为绝对路径,若是返回True
os.path.basename("/Library/WebServer/Documents/index.html")   # 获取文件名  输出 index.html
os.path.dirname("/Library/WebServer/Documents/index.html")    # 获取文件路径/Library/WebServer/Documents
os.path.split("/Library/WebServer/Documents/index.html")      # 获取文件路径和文件名  输出元组('/Library/WebServer/Documents', 'index.html')
os.path.sep    # 文件路径的分隔符  linux、mac上是/ , windows上是\\ 如 :"/Library/WebServer/Documents/index.html".split(os.path.sep)  
os.path.getsize('/Library/WebServer/Documents/index.html')  # 获取文件大小
os.listdir('/Library/WebServer/Documents')     # 获取文件夹下的所有文件
os.path.exists('/Library/WebServer/Documents') # 判断文件或文件夹是否存在   输出True
os.path.isdir('/Library/WebServer/Documents')  # 判断是否是一个文件夹
os.path.isfile('/Library/WebServer/Documents/index.html')  # 判断是否是一个文件

# 文件读写
filehandle = open("/Library/WebServer/Documents/index.html")   # 创建一个file对象
filecontent = filehandle.read()   # 读取文件内容   
filecontent = filehandle.readlines()  # 读取文件内容    列表   每行数据是列表中一个元素
filehandle = open("/Library/WebServer/Documents/index.html", "w") # 第二个参数w表示写模式   a表示添加模式 
filehandle.write('aaa')   # w会覆盖源文件, a在源文件后添加写入

# shutil 模块
import shutil
shutil.copy('/Library/WebServer/Documents/index.html','/Library/WebServer/' ) # 文件拷贝  原路径 目标路径
shutil.copytree('/Library/WebServer',  '/Library')  # 递归拷贝文件夹下面的所有文件和文件夹  原路径 目标路径
shutil.move('/Library/WebServer/Documents/index.html','/Library/WebServer/' ) # 文件移动和改名  原路径 目标路径
os.unlink('/Library/WebServer/Documents/index.html')  #删除文件
os.rmdir('/Library/WebServer/Documents')  #删除文件夹  必须是空文件夹
shutil.rmtree('/Library/WebServer/Documents')  #删除文件夹 递归删除下面所有的文件和文件夹

# zipfile 解压缩文件
import zipfile
ziphandle = zipfile.ZipFile('example.zip')   #实例化一个zipfile对象
ziphandle.namelist()   #返回zip内所有文件和文件夹列表
ziphandle.extractall('/Library/WebServer/Documents')  #解压缩到指定目录  默认当前目录
ziphandle.extractall('example.txt', '/Library/WebServer/Documents')  # 解压缩zip内单个文件到指定目录  默认当前目录
ziphandle.close()

ziphandle = zipfile.ZipFile('example.zip', 'w')   # 实例化一个zipfile对象   w 覆盖写入 a 添加模式
ziphandle.write('example.txt', compress_type=zipfile.ZIP_DEFLATED)  # 压缩文件到zip   第二个参数指定压缩类型
ziphandle.close()


6、日志

import logging 
logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s') # 设置日志显示最低级别  和  日志输出格式
日志级别 DEBUG    INFO   WARNING  ERROR  CRITICAL
logging.debug('output logging')   # 输出日志
logging.info('output logging')
logging.warning('output logging')
logging.error('output logging')
logging.critical('output logging')
logging.disable(logging.CRITICAL)  # 禁用当前级别和更低级别日志的显示
logging.basicConfig(filename='log.txt', level=logging.DEBUG, format=' %(asctime)s - %(levelname)s - %(message)s')   # 将日志输入到文件中, 而不是显示在屏幕上


7、网络请求requests

安装 pip3 install requests

import requests

headers = { 
    "Accept":"text/html,application/xhtml+xml,application/xml;",
    "Accept-Encoding":"gzip, deflate, sdch",
    "Accept-Language":"zh-CN,zh;q=0.8,en;q=0.6",
    "Referer":"http://www.xicidaili.com",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36"
} # 请求头

proxy = {
     'http': '120.25.253.234:812',
     'https' '163.125.222.244:8123'
} # 请求代理

response = requests.get('http://www.baidu.com', params={'name': 'tom', 'age':20}, headers=headers,proxies=proxy)
response = requests.post('http://httpbin.org/post', data={'name': 'tom', 'age':20})
print(response.status_code)     # 打印状态码
print(response.url)             # 打印请求url
print(response.headers)         # 打印头信息
print(response.cookies)         # 打印cookie信息
print(response.text)            # 以文本形式打印网页源码
print(response.json())          # 获取返回的json
print(response.content)         # 以字节流形式打印


8、Excel操作

# 读excel文档  
openpyxl 模块        文档   

import openpyxl

wb = openpyxl.load_workbook('example.xlsx')
wb.get_sheet_names()         # 获取所有表名的列表   输出 ['Sheet1', 'Sheet2', 'Sheet3']
sheet = wb.get_sheet_by_name('Sheet3')   # 根据表名获取工作表对象
sheet = wb.get_active_sheet()     # 获取当前工作表的表对象
c = sheet['A1']                   # 表中单元格的对象
c.value                           # 单元格的值
c.row                             # 单元格所处行
c.colum                           # 单元格所处列
sheet.cell(row=1, column=2)       # 根据行列获取单元格对象
sheet.get_heightest_row()         # 获取表行数  输出一个整数
sheet.get_heightest.column()      # 获取表列数   输出一个整数
from openpyxl.cell import get_column_letter, column_index_from_string
get_cloumn_letter(1)              # 根据数字获取列对应的字母   输出A
get_index_from_string('A')        # 根据列字母获取对应的数字   输出  1
sheet['A1':'C3']                  # 切片获取单元格列表
sheet.colums[1]                   # 获取整列的元组列表
sheet.rows['A']                   # 获取整行的元组列表

# 写excel文档  
wb = openpyxl.Workbook()          # 创建一个workbook空对象
sheet = wb.get_active_sheet()
sheet.title='sheet1'              # 设置表名
sheet['A1'] = 'hello world'       # 设置单元格的值
wb.save('example.xlsx')           # 保存Excel
wb.creat_sheet(index=0, title='sheet1')   # 创建一个工作表,两个参数可选,第一个是工作表的位置,第二个是表名
wb.remove_sheet(wb.get_sheet_by_name('sheet1'))  # 根据表名获取一个表对象,然后删除表

# 设置单元格字体样式
from openpyxl.styles import Font, Style

fontObj = Font(name='Times new Roman', bold=True)   #  实例化一个字体对象 字体对象可接收4个参数   name  字体名称  size  字体大小  bold 是否加粗(True or False)  italic 是否斜体(True or False)
styleObj = Style(font=fontObj)  # 实例化一个样式对象,传入字体
sheet['A1'] .style/styleObj     # 设置单元格的样式
sheet['A1'] = 'test excel fonts'  

# 设置公式
sheet['A9'] = '=SUM(A1:A8)'  # 单元格插入公式
sheet['A9'].value    # 获取单元格的值会得到公式字符串 输出 'SUM(A1:A8)'  ,如果想要获取计算过后的值,可以在load_workbook时传入data_only=True

# 设置行高和列宽
sheet.row_dimensions[1].height = 70   # 设置第一行的行高为70
sheet.row_dimensions['B'].width = 20  # 设置B列的列宽是20

# 合并和拆分单元格
sheet.merge_cells('A1:D3')   # 合并单元格
sheet.unmerge_cells('A1:D3') # 拆分单元格
sheet.freeze_panes = "A2"    # 冻结单元格(单元格悬浮,滚动滚条单元格始终可见) 冻结单元格上边的所有行和左边的所有列,单元格所在的行或列不会被冻结
sheet.freeze_panes = "A1" 或 sheet.freeze_panes = None   # 解冻所有的单元格


9、处理PDF

pip install PyPDF2

# 读取PDF文本
import PyPDF2

pdfObj = open('example.pdf', 'rb')       # 打开一个PDF
pdfReader = PyPDF2.PdfFileReader(pdfObj) # 读取pdf,获取一个pdf对象
pdfReader.numPages      # 获取PDF的页数
pdfReader.isEncrypted   # 获取PDF是否加密  若PDF加密返回True
pdfReader.decrypt('密码')       # 输入密码,解密PDF 
pageObj = pdfReader.getPage(0) # 读取PDF某一页
pageObj.rotateClockwise(90)    # 旋转页面,参数为旋转的度数
pageObj.extractText()          # 获取pdf的文本
pdfWriter = PyPDF2.PdfFileWriter() # 获取PDF的写对象
pdfWriter.addPage(pageObj)  # 给PDF添加一个页面,将一个PDF的页面对象添加到哪另一个pdf中
pdfWriter.encrypt('密码')    # 为pdf加密,参数为加密的密码
pdfFile = open('example.pdf', 'wb') 
pdfWriter.writer(pdfFile)   # 将pdf保存到文件中
pdfFile.close()
pageObj.merge(pageObj2)     # 将一个pdf叠加的另一个pdf上


10、处理Word文档

pip install python-docx
import docx
doc = docx.Document('demo.docx')   # 获取文档对象
len(doc.paragraphs)         # 文档对象的段落数
doc.paragraphs[0].text      # 获取某个段落的文本
len(doc.paragraphs[0].runs) # 获取一个段落的runs对象的个数,一个段落样式相同的部分为一个runs
doc.paragraphs[0].runs[0].text  # 获取一个run对象的文本
paraObj = doc.add_paragraph('Hello world')  # 添加一个段落
paraObj.add_run(' hello ')      # 给段落添加一个run
doc.add_heading('header', 1)    # 添加标题,第二个参数表示是几级标题
doc.add_paragraph[0].runs[0].add_break(docx.text.WD_BREAK.PAGE)  # add_break 不传参添加一个换行符,传docx.text.WD_BREAK.PAGE 表示换页符
doc.add_picture('test.png', width=docx.shared.Inches(1), height=docx.shared.Cm(1))  # 添加图片,width图片宽,height 图片高
doc.save('example.docx')  # 保存文档


11、操作CSV

import csv
# 读
exampleFile = open('example.csv')        # 打开一个csv文件
exampleReader = csv.reader(exampleFile)  # 读取文件内容
exampleData = list(exampleReader)        # 将内容放入一个list列表中
for row in exampleReader
    exampleReader.line_num  #当前行的行数
    row  #当前行的内容

# 写
outputFile = open('example.csv', 'w', newline='')   # 以写方式打开一个csv文件,newline固定传一个空串
outputWriter = csv.writer(outputFile)  # 获取一个写对象
outputWriter.writerow(['aaa', 'bbb', 'ccc'])   # 写内容
outputFile.close()  # 关闭文件


12、处理json

# 处理json
import json 
jsonValue = json.loads('{"name": "example"}')   # 字符串转json
jsonStr = json.dumps({"name": "example"})       # json转字符串


13、time模块

import time
time.time()   # 获取Unix时间戳  输出 1546529650.038243
time.sleep()  # 睡眠函数,传秒数
round(time.time(), 2)  # 四舍五入保留两位小数


14、datetime模块

datetime.datetime.now()  # 获取当前时间的日期格式  输出 datetime.datetime(2019, 1, 3, 23, 40, 37, 640257) 年 月 日 时 分 秒 微妙
dt = datetime.datetime(2019, 1, 3, 23, 40, 37, 640257)
dt.year   # 获取年  输出 2019
dt.month  # 获取月  输出 1
dt.day    # 获取天 输出 3
dt.hour   # 获取时 输出 23
dt.minute # 获取分  输出 40
dt.second # 获取秒 输出 37
datetime.datetime.fromtimestamp(time.time())  # 将时间戳转化为日期格式,输出 datetime.datetime(2019, 1, 3, 23, 40, 37, 640257)

# datetime 可直接用于比较大小
delta = datetime.timedelta(days=11, hours=10, minutes=9,seconds=8) # 获取一个时间段 可传 weeks days hours minutes seconds milliseconds microseconds   没有 month 和 year
delta.days     # 时间段的天数  输出11
delta.seconds  # 时间段的秒数 输出36548  不带天的秒数
delta.microseconds # 获取微秒
delta.total_seconds()  # 总秒数(带天数)
datetime.datetime.now() + datetime.timedelta(days=100)  # 可以直接相加
datetime.datetime(2019, 1, 3, 23, 40, 37, 640257).strftime('%Y/%m/%d %H:%M:%S')   # 格式化时间戳   输出  '2019/01/03 23:40:37'
%Y  年   2019
%y  年  19
%m  月  01
%B  月  November
%b  月 简写  Nov
%d  天  04
%j  天  一年的第几天  365
%w  天  一周第几天   0-6
%A  周几   Monday
%a  周几 简写   Mon
%H  小时   01
%I  小时   01-12
%M  分  00-59
%S  秒  00-59
%p  AM或PM
%%  转义就是%
datetime.datetime.strptime('2019/01/03 23:40:37', '%Y/%m/%d %H:%M:%S')  # 字符串转化为datetime格式


15、图像处理

pip install pillow

from PIL import ImageColor

ImageColor.getcolor('red', 'RGBA')  # 输出(255, 0, 0,255)根据颜色获取RGBA值
from PIL import Image
Im = Image.open('test.png')
Im.size        # 图片宽高  输出 (816, 1088)
Im.filename    # 获取文件名称  输出 test.png
Im.format      # 获取文件类型 输出 PNG
Im.save('test.jpg')  # 保存为jpg格式
Im=Image.new('RGBA', (100, 200), 'red')   # 创建一个空白图片 背景色值类型  图片大小  背景色(默认黑色)
croppedIm = Im.crop((335, 345, 565, 560))   # 裁切图像
croppedIm.save('cropped.png')   # 保存裁切后的图像
copyIm = Im.copy()
copyIm.paste(Im, (0, 0))   # 将一张图片合并到另一张图片上  第二个参数是放置的位置
resizeIm = Im.resize(100, 100)  # 修改图片宽高
Im.rotate(90, expand=True).save('rotate.png')   # 旋转图片并保存为新图像  expand 可选  旋转后的图片是否适应画布
Im.transpose(Image.FLIP_LEFT_RIGHT).save('horizontal.png')  # 水平翻转图片
Im.transpose(Image.FLIP_TOP_BOTTOM).save('vertical.png')    # 垂直翻转图片
im.getpixel((0, 0))   # 获取图像某一坐标的色值  传入 坐标 输出RGBA色值(0,0,0,0)
im.putpixel((0,0), (210, 210, 210))  # 修改某一坐标色值  传入坐标 和 色值(RGB 或 RGBA)

from PIL import Image, ImageDraw   # 在图像上绘制图形

Im=Image.new('RGBA', (100, 200), 'red')
draw = ImageDraw.Draw(Im)  # 获取一个绘图对象
draw.line([(0,0), (199, 0),(199, 199), (0, 199), (0, 0)], fill='black',width=1) # 绘制直线  连接点的坐标   fill 线条颜色 可选 默认黑色   width 线条宽度 可选 默认1
draw.rectangle((20, 30, 60, 60), fill='blue', outline='black') # 绘制矩形  (左上角x 左上角y 右下角x 右下角y)  填充颜色 可选 轮廓颜色 可选
draw.ellipse((120, 30, 160, 60), fill='red', outline='black')  # 绘制椭圆  (包含椭圆的矩形的坐标) 填充颜色 可选 轮廓颜色 可选
draw.line(((0,0), (199, 0),(199, 199), (0, 199), (0, 0)), fill='black', outline='black') # 绘制多边形  类似绘制直线 最后一个点会自动连接第一个点  填充颜色 可选 轮廓颜色 可选
Im.save('draw.png')

from PIL import Image, ImageDraw, ImageFont

Im=Image.new('RGBA', (100, 200), 'red')
draw = ImageDraw.Draw(Im)    # 获取一个绘图对象
arialFont = ImageFont.truetype(字体路径,字体大小)
draw.text((100, 150), 'hello', fill='red', font=arialFont)  # 字体位置 字体内容 字体颜色 字体样式
Im.save('text.png')


16、发送邮件

import smtplib

smtp = smtplib.SMTP() 
smtp.connect('smtp.163.com, 25')    # 链接邮件服务器  端口
smtp.login(username, password)      # 登录账户  密码
smtp.sendmail(sender, receiver, msg.as_string())   # 发送者邮箱   接收者邮箱  发送内容as_string()是将msg变为str。
smtp.quit()

from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage 
from email.header import Header    
# 构造邮件对象MIMEMultipart对象
# 下面的主题,发件人,收件人,日期是显示在邮件页面上的。
msg = MIMEMultipart('mixed') 
msg['Subject'] = 'Python email test'
msg['From'] = 'XXX@163.com <XXX@163.com>' # 收件人为多个收件人,通过join将列表转换为以;为间隔的字符串
msg['To'] = ";".join(receiver) 

#构造文字内容   
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.baidu.com"    
text_plain = MIMEText(text,'plain', 'utf-8')    
msg.attach(text_plain)    

sendimagefile=open(r'D:\pythontest\testimage.png','rb').read()  # 构造图片链接
image = MIMEImage(sendimagefile)
image.add_header('Content-ID','<image1>')
image["Content-Disposition"] = 'attachment; 
filename="testimage.png"'
msg.attach(image)

# 构造html
html = """
<html>  
  <head></head>  
  <body>  
    <p>Hi!<br>  
       How are you?<br>  
       Here is the <a href="http://www.baidu.com">link</a> you wanted.<br> 
    </p> 
  </body>  
</html>  
"""    
text_html = MIMEText(html,'html', 'utf-8')
text_html["Content-Disposition"] = 'attachment; 
filename="texthtml.html"'   
msg.attach(text_html)  
  
# 构造附件
sendfile=open(r'D:\pythontest\1111.txt','rb').read()
text_att = MIMEText(sendfile, 'base64', 'utf-8') 
text_att["Content-Type"] = 'application/octet-stream'  
msg.attach(text_att)    
       
# 发送邮件
smtp = smtplib.SMTP()    
smtp.connect('smtp.163.com')
smtp.login(username, password)    
smtp.sendmail(sender, receiver, msg.as_string())    
smtp.quit()


17、其他杂七杂八

import  # 导入模块

import random
random.randint(1, 10)  # 生成1-10之间的随机整数
或
from random import *  或 from random import randint
randint(1, 10)  # 导入模块内方法, 可以直接使用方法

# 提前结束程序
import sys
sys.exit();

input()   # 获取用户输入值
print("what is your name?")
myName = input()  # 程序暂停,等待用户输入,赋值给myName
print("my name is "+myName)
# 输出
my name is ysgs