目 录
- 时间
- 格式化
- 格式化日期函数
- 文件
- 文件基本信息
- 获取信息
- 格式化大小
- 系统
- 网络
- Socket
- TCP编程
- 流程
- 服务端
- 客户端
- UDP编程(以温度转换为例)
- 流程
- 服务端
- 客户端
- 数据库
- MySQL
- 连接数据库
- 创建数据表
- 批量增加多条数据
- SQLite
- 创建数据库和user表
- 增加数据
- 查看数据
- 删除数据
- GUI
- wxPython
- 登陆界面
=================================================================================
时间
格式化
格式化日期函数
def formatTime(longtime): # 2020-07-05 14:13:48
"""
格式化日期时间
:param longtime: 要格式化的时间
:return: 格式化的时间
"""
import time
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(longtime))
=================================================================================
文件
文件基本信息
获取信息
import os
def getFileinfo():
with open('fileinfo.txt','w',encoding='utf-8') as f: # 在测试前创建一个文件,可以省略
f.write('这是一个用于测试获取文件基本信息的文件!')
fileinfo = os.stat('fileinfo.txt')
print('文件完整路径:', os.path.abspath('fileinfo.txt'))
print('索引名:', fileinfo.st_ino)
print('设备号:', fileinfo.st_dev)
print('文件大小:', formatByte(fileinfo.st_size))
print('最后一次访问时间:', formatTime(fileinfo.st_atime))
print('最后一次修改时间:', formatTime(fileinfo.st_mtime))
print('最后一次状态变化时间:', formatTime(fileinfo.st_ctime))
格式化大小
def formatByte(number):
"""
格式化文件大小
:param number:要格式化的字节数
:return:
"""
for (scale, label) in [(1024*1024*1024, 'GB'),(1024*1024, 'MB'),(1024,'KB')]:
if number >= scale: # 如果文件大小大于或等于1KB
return "%.2f %s" % (number*1.0/scale, label)
elif number == 1: # 如果文件大小为1KB
return "1 字节"
else: # 处理小于1KB的情况
byte = '%.2f' % (number or 0)
# 去掉结尾的.00,并且加上单位“字节”
return (byte[:-3] if byte.endswith('.00') else byte) + "字节"
=================================================================================
系统
=================================================================================
网络
Socket
函数 | 描述 |
s.bind() | 绑定地址(host, port)到套接字,在AF_INET下以元组形式表示 |
s.listen() | 开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。至少为1,一般为5 |
s.accept() | 被动TCP连接,以阻塞方式等待连接的到来 |
s.connect() | 主动初始化TCP连接,一般address的格式为元组(hostname,port),如果连接出错,则返回socket.error错误 |
s.recv() | 接收TCP数据,以字符串形式返回,bufsize指定接收最大数据量,flag提供其他信息,可以忽略 |
s.send() | 发送TCP数据,将数据发送到连接的套接字。返回值是要发送的字节数量,可能小于string的字节大小。 |
s.sendall() | 完整发送TCP数据,返回之前尝试发送所有数据,成功返回None,失败则抛出异常 |
s.recvfrom() | 接收UDP数据,与recv()类似,但返回值是(data,address) |
s.sendto() | 发送UDP数据,address是(ipaddr, port)的元组,指定远程地址。返回值是发送的字节数 |
s.close() | 关闭套接字 |
TCP编程
流程
服务端
import socket
host = socket.gethostname()
port = 12345
web = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
web.bind((host, port))
web.listen(1)
sock, addr = web.accept()
print("连接已经建立")
info = sock.recv(1024).decode()
while info != 'byebye':
if info:
print("接收到的内容:" + info)
send_data = input("输入发送内容:")
sock.send(send_data.encode())
if send_data == "byebye":
break
info = sock.recv(1024).decode()
sock.close()
web.close()
客户端
import socket
s = socket.socket()
host = socket.gethostname()
port = 12345
s.connect((host, port))
print("已连接")
info = ''
while info != "byebye":
send_data = input("输入发送内容:")
s.send(send_data.encode())
if send_data == "byebye":
break
info = s.recv(1024).decode()
print("接收到的内容:"+ info)
s.close()
UDP编程(以温度转换为例)
流程
服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))
print('绑定UDP到8888端口')
data, addr = s.recvfrom(1024)
data = float(data)*1.8+32
send_data = '转换后的温度(单位:华氏温度):' + str(data)
print('Received from %s:%s' % addr)
s.sendto(send_data.encode(), addr)
s.close()
客户端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
data = input('输入要转换的温度(单位:摄氏度):')
s.sendto(data.encode(), ('127.0.0.1', 8888))
print(s.recv(1024).decode())
s.close()
=================================================================================
数据库
MySQL
连接数据库
import pymysql
# 打开数据库连接,参数1:主机名或IP;参数2:用户名;参数3:密码;参数4:数据库名称
db = pymysql.connect("localhost","root","root","Mydatabase")
创建数据表
import pymysql
# 打开数据库连接,参数1:主机名或IP;参数2:用户名;参数3:密码;参数4:数据库名称
db = pymysql.connect("localhost","root","root","Mydatabase")
# 使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
# 执行SQL,如果表存在,则删除
cursor.execute("DROP TABLE IF EXISTS books")
# 使用预处理语句创建表
sql = """
create table books(
id int(8) not null auto_increment,
name varchar(50) not null,
primary key(id)
)engine=MyISAM auto_increment=1 default charset=utf8;
"""
# 执行sql命令
cursor.execute(sql)
# 关闭数据库连接
db.close()
批量增加多条数据
import pymysql
# 打开数据库连接,参数1:主机名或IP;参数2:用户名;参数3:密码;参数4:数据库名称
db = pymysql.connect("localhost","root","root","Mydatabase")
# 使用cursor()方法创建一个游标对象cursor
cursor = db.cursor()
# 数据列表
data = [
'Java','69.8'),
]
# 使用预处理语句
sql = "insert into books(name, category, price) values (%s, %s, %s)" % data
# 执行sql命令
cursor.executemany(sql)
# 提交数据
db.commit()
# 关闭数据库连接
db.close()
SQLite
创建数据库和user表
import sqlite3
# 连接到SQLite数据库
# 数据库文件是sqlite.db,若不存在则自动创建
conn = sqlite3.connect('sqlite.db')
# 创建一个Cursor
cursor = conn.cursor()
# 执行一条SQL语句,创建user表
cursor.execute('create table user (id int(10) primary key,name varchar(20))')
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
增加数据
import sqlite3
# 连接SQLite数据库
# 数据库文件是sqlite.db;如果不存在,自动创建
conn = sqlite3.connect('sqlite.db')
# 创建一个Cursor
cursor = conn.cursor()
# 执行一条SQL语句,插入记录
cursor.execute('insert into user (id, name) values ("1", "MRSOFT")')
cursor.execute('insert into user (id, name) values ("2", "Andy")')
cursor.execute('insert into user (id, name) values ("3", "小助手")')
# 关闭游标
cursor.close()
# 提交事务
conn.commit()
# 关闭连接
conn.close()
查看数据
import sqlite3
# 连接SQLite数据库
# 数据库文件是sqlite.db;如果不存在,自动创建
conn = sqlite3.connect('sqlite.db')
# 创建一个Cursor
cursor = conn.cursor()
# 执行一条SQL语句,查询所有数据
cursor.execute('select * from user')
# 获取查询结果
# result1 = cursor.fetchone()
# print(result1) # (1, 'MRSOFT')
# result2 = cursor.fetchmany(2)
# print(result2) # [(1, 'MRSOFT'), (2, 'Andy')]
result3 = cursor.fetchall()
print(result3) # [(1, 'MRSOFT'), (2, 'Andy'), (3, '小助手')]
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
删除数据
import sqlite3
# 连接SQLite数据库
# 数据库文件是sqlite.db;如果不存在,自动创建
conn = sqlite3.connect('sqlite.db')
# 创建一个Cursor
cursor = conn.cursor()
# 执行一条SQL语句,删除一条记录
cursor.execute('delete from USER where id=?',(1,))
# 关闭游标
cursor.close()
# 提交事务
conn.commit()
# 关闭连接
conn.close()
=================================================================================
GUI
wxPython
登陆界面
import wx
class MyFrame(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, title='创建TextCtrl类')
# 创建面板
panel = wx.Panel(self)
# 创建文本和密码输入框,左对齐
self.title = wx.StaticText(panel, label='请输入用户名和密码')
self.label_user = wx.StaticText(panel, label='用户名')
self.text_user = wx.TextCtrl(panel, style=wx.TE_LEFT)
self.label_pwd = wx.StaticText(panel, label='密 码')
self.text_pwd = wx.TextCtrl(panel, style=wx.TE_PASSWORD)
# 创建确定和取消按钮,并绑定事件
self.bt_confirm = wx.Button(panel, label='确定')
self.bt_confirm.Bind(wx.EVT_BUTTON, self.onClickSubmit)
self.bt_cancel = wx.Button(panel, label='取消')
self.bt_cancel.Bind(wx.EVT_BUTTON, self.onClickCancel)
# 添加容器,容器中控件横向排列
hsizer_user = wx.BoxSizer(wx.HORIZONTAL)
hsizer_user.Add(self.label_user, proportion=0, flag=wx.ALL, border=5)
hsizer_user.Add(self.text_user, proportion=1, flag=wx.ALL, border=5)
hsizer_pwd = wx.BoxSizer(wx.HORIZONTAL)
hsizer_pwd.Add(self.label_pwd, proportion=0, flag=wx.ALL, border=5)
hsizer_pwd.Add(self.text_pwd, proportion=1, flag=wx.ALL, border=5)
hsizer_btn = wx.BoxSizer(wx.HORIZONTAL)
hsizer_btn.Add(self.bt_confirm, proportion=0, flag=wx.ALIGN_CENTER, border=5)
hsizer_btn.Add(self.bt_cancel, proportion=0, flag=wx.ALIGN_CENTER, border=5)
# 添加容器,容器中控件纵向排列
vsier_all = wx.BoxSizer(wx.VERTICAL)
vsier_all.Add(self.title, proportion=0, flag=wx.BOTTOM|wx.TOP|wx.ALIGN_CENTER, border=15)
vsier_all.Add(hsizer_user, proportion=0, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=45)
vsier_all.Add(hsizer_pwd, proportion=0, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=45)
vsier_all.Add(hsizer_btn, proportion=0, flag=wx.CENTER|wx.TOP, border=15)
panel.SetSizer(vsier_all)
def onClickSubmit(self, event):
"""单击确定按钮触发登陆事件,并给出反馈"""
message = ''
username = self.text_user.GetValue()
password = self.text_pwd.GetValue()
if username == '' or password == '':
message = '用户名或密码不能为空!'
elif username == 'mr' and password == 'mrsoft':
message = '登陆成功!'
else:
message = '用户名和密码不匹配!'
wx.MessageBox(message)
def onClickCancel(self, event):
"""点击取消按钮触发清空操作"""
self.text_user.SetValue('')
self.text_pwd.SetValue('')
if __name__ == '__main__':
app = wx.App()
myframe = MyFrame(parent=None, id=-1)
myframe.Show()
app.MainLoop()
=================================================================================