1.time模块
Unix时间戳转与时间的转换
将时间戳转换成时间,首先需要将时间戳转换成localtime,再转换成时间的具体格式:
利用localtime()函数将时间戳转化成localtime的格式
利用strftime()函数重新格式化时间
# -*- coding:utf-8 -*-
import time
# 将时间戳转化为目标时间格式
def timestamp_datatime(value):
format = '%Y-%m-%d %H:%M'
# format = '%Y-%m-%d %H:%M:%S'
# value 为时间戳值,如:1460073600.0
value = time.localtime(value)
dt = time.strftime(format, value)
return dt
# 将目标时间格式转化为时间戳
def datetime_timestamp(dt):
newTime = time.strptime(dt, '%Y-%m-%d %H:%M')
s = time.mktime(newTime)
return s
if __name__ == '__main__':
s = timestamp_datatime(1460073600.0)
print(s) # 2016-04-08 08:00
d = datetime_timestamp('2019-06-05 08:00')
print(d) # 1559692800.0
按指定的格式获取当前时间
利用time()获取当前时间,再利用localtime()函数转换为localtime,最后利用strftime()函数重新格式化时间。
#coding:UTF-8
import time
#获取当前时间
time_now = int(time.time())
#转换成localtime
time_local = time.localtime(time_now)
#转换成新的时间格式(2016-05-09 18:59:20),时间连接符号可改变
dt = time.strftime("%Y-%m-%d %H:%M:%S",time_local)
print(dt)
2.DBUtils管理数据库连接池
当使用多线程,多进程将海量数据存入数据库时,每次执行一个sql的时候都单独建立一个mysql连接,执行完就close掉,很明显这样的问题在于,频繁连接,断开mysql,这样是相当消耗系统资源的,而且增加了mysql连接失败的几率,所以万一哪个线程没有连接成功 这个线程也over了。
2.1 连接池原理
1.在程序创建连接的时候,可以从一个空闲的连接中获取,不需要重新初始化连接,提升获取连接的速度
2.关闭连接的时候,把连接放回连接池,而不是真正的关闭,所以可以减少频繁地打开和关闭连接
安装DBUtils库
pip install DBUtils
参数解释
参数 | 详解 |
---|---|
creator, | # 使用链接数据库的模块(必须:pymssql,pymysql,cx_oralce,…) |
mincached=0, | # 初始化时,链接池中至少创建的空闲的链接,0表示不创建 |
maxcached=0, | # 链接池中最多闲置的链接,0和None不限制 |
maxshared=0, | # 链接池中最多共享的链接数量,0和None表示全部共享。PS: 无用 |
maxconnections=0, | # 连接池允许的最大连接数,0和None表示不限制连接数 |
blocking=False, | # 连接池中如果没有可用连接后,是否阻塞等待。True,等待;False,不等待然后报错 |
maxusage=None, | # 一个链接最多被重复使用的次数,None表示无限制 |
setsession=None, | # 开始会话前执行的命令列表。如:[“set datestyle to …”, “set time zone …”] |
reset=True, | |
failures=None, | |
ping=1, | # ping MySQL服务端,检查是否服务可用 |
数据库设置(数据库连接模块不一样,其参数名也不同)
如creator=pymysql:
host=‘localhost’, port=3306,db=‘mydata’,user=“root”,passwd=“123456”,charset=‘utf8’
数据库通用连接函数(连接模块视实际数据库决定)
from DBUtils import PooledDB
import pymssql
class sqlserverManager(object):
# 构造函数,初始化连接
def __init__(self, server, user, password, database, table):
self.server = server
self.user = user
self.password = password
self.database = database
self.table = table
self.conn = None
self.cursor = None
self.maxconnections = 15 # 设置最大连接数
# 保存数据到SQL server
def connect_database(self):
try:
self.conn = PooledDB(creator=pymssql,
maxconnections=self.maxconnections,
server=self.server,
user=self.user,
password=self.password,
database=self.database,
charset='utf8').connection()
# 创建游标
self.cursor = self.conn.cursor()
print("sql server had connected")
except Exception as e:
print("the connect failed:", e)
return None
def dbclose(self):
self.cursor.close()
self.conn.close()
def dbcommit(self):
self.conn.commit()
def execute(self, sql):
print("-----插入数据-----")
try:
self.cursor.execute(sql)
except Exception as e:
print('\033[1;31;0m\t4---插入更新失败,msg:\033[0m', e, sql.replace("\n", ""))
self.conn.rollback()
return False
return True
2.2 多线程(连接池)操作MySQL插入数据
启动线程任务
每调用一次插入函数就从连接池中取出一个链接操作,完成后关闭链接;
executemany 批量操作,减少 commit 次数,提升效率;
3.ftplib操作ftp实现上传和下载的
ftplib模块是系统默认安装的,实现文件的上传与下载
3.1 ftp登陆连接
from ftplib import FTP #加载ftp模块
ftp=FTP() #设置变量
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print(ftp.getwelcome()) #打印出欢迎信息
bufsize=1024 #设置的缓冲区大小
filename="filename.txt" #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize) #接收服务器上文件并写入本地文件
ftp.set_debuglevel(0) #关闭调试模式
ftp.quit() #退出ftp
# ftp相关命令操作
ftp.cwd(pathname) #设置FTP当前操作的路径
ftp.dir() #显示目录下所有目录信息
ftp.nlst() #获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname) #删除远程目录
ftp.delete(filename) #删除远程文件
ftp.rename(fromname, toname)#将fromname修改名称为toname。
ftp.storbinary("STOR filename.txt",file_content,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_content,bufsize) #下载FTP文件
4.os模块
记下常用的os模块的操作指令
命令 | 含义 |
---|---|
os.getcwd() | 获取当前工作目录,即当前python脚本工作的目录路径,相当于shell的pwd |
os.chdir(“dirname”) | 改变当前脚本工作目录;相当于shell下cd |
os.curdir | 返回当前目录: (’.’) |
os.pardir | 获取当前目录的父目录字符串名:(’…’) |
os.makedirs(‘dirname1/dirname2’) | 可生成多层递归目录 |
os.removedirs(‘dirname1’) | 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 |
os.mkdir(‘dirname’) | 生成单级目录;相当于shell中mkdir dirname |
os.rmdir(‘dirname’) | 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname |
os.listdir(‘dirname’) | 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 |
os.remove() | 删除一个文件 |
os.rename(“oldname”,“newname”) | 重命名文件/目录 |
os.stat(‘path/filename’) | 获取文件/目录信息 |
os.name | 输出字符串指示当前使用平台。win->‘nt’; Linux->‘posix’ |
os.system(“执行的命令”) | 运行shell命令,直接显示,相当于直接在cmd命令中执行 |
os.environ | 获取系统环境变量 |
os.path.abspath(path) | 返回path规范化的绝对路径 |
os.path.split(path) | 将path分割成目录和文件名二元组返回 |
os.path.dirname(path) | 返回path的目录。其实就是os.path.split(path)的第一个元素 |
os.path.basename(path) | 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素 |
os.path.exists(path/file) | 如果路径或文件存在,返回True;如果path不存在,返回False |
os.path.isabs(path) | 如果path是绝对路径,返回True |
os.path.isfile(path) | 如果path是一个存在的文件,返回True。否则返回False |
os.path.join(path1,path2,…,pathn) | 将多个路径组合后返回 |
简要样例说明:
>>> os.path.split("/Users/hqs/PycharmProjects/startMyPython3.0")
('/Users/hqs/PycharmProjects', 'startMyPython3.0')
>>> os.path.dirname('/Users/hqs/PycharmProjects/startMyPython3.0')
'/Users/hqs/PycharmProjects'
>>>os.system("ping 127.0.0.1")
正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms
>>>os.path.abspath(__file__)
当前文件的绝对路径
>>>os.path.dirname(os.path.abspath(__file__))
当前文件的上一层目录的绝对路径
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
当前文件的上上层目录的绝对路径
5 datetime模块
1.datetime.date:表示日期的类
2.datetime.datetime:表示日期时间的类
3.datetime.time:表示时间的类
4.datetime.timedelta:表示时间间隔,即两个时间点的间隔
5.datetime.tzinfo:时区的相关信息
>>>datetime.datetime.now()
当前系统时间:datetime.datetime(2019, 12, 3, 20, 31, 10, 740869)
>>>datetime.datetime.now().year/month/day
分别为:2019,12,3
>>>datetime.datetime.now().weekday()
1 表示在第几周
>>>time1 = datetime.datetime(2016, 10, 20)
>>>time2 = datetime.datetime(2015, 11, 2)
"""计算天数差值"""
print(time1-time2).days
"""计算两个日期之间相隔的秒数"""
print (time1-time2).total_seconds()
# 获取当前时间,并转化为字符串型
>>>time_new = str(datetime.datetime.now().date()) # '2019-12-4'
# 以当天的09:00为开始时间(时间戳格式)
>>>time_on = time.mktime(time.strptime(time_new+ ' 09:00', '%Y-%m-%d %H:%M'))
# 以当天的18:00为结束时间(时间戳格式)
>>>time_off = time.mktime(time.strptime(time_new+ ' 18:00', '%Y-%m-%d %H:%M'))
# 当前星期几
>>>week_now = datetime.datetime.now().weekday()
# 当前时间
>>>time_now = datetime.datetime.now() # datetime.datetime(2019, 12, 4, 14, 57, 48, 988520)
# 当前第几小时(24小时制)
>>>hour_now = datetime.datetime.now().hour # 14
5.tqdm模块(最优雅的进度条)
from tqdm import tqdm
使用方法:
from tqdm import tqdm
import time
if __name__ == '__main__':
for i in tqdm(range(1000)):
time.sleep(0.5)
6.控制台输出带颜色文字的方法
设置颜色开始 :\033[显示方式;前景色;背景色m 文本内容 \033[0m(此处为结束语)
print('\033[1;31m我以我血荐轩辕\033[0m')
print('\033[4;35m我以我血荐轩辕\033[0m')
print('\033[5;37;40m我以我血荐轩辕\033[0m')
print('\033[0;32m我以我血荐轩辕\033[0m')
print('\033[1;32m我以我血荐轩辕\033[0m')