目 录

  • 时间
  • 格式化
  • 格式化日期函数
  • 文件
  • 文件基本信息
  • 获取信息
  • 格式化大小
  • 系统
  • 网络
  • 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编程

流程

python 调用迅雷下载aip_数据

服务端

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编程(以温度转换为例)

流程

python 调用迅雷下载aip_SQL_02

服务端

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()

=================================================================================