栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【项目实训】个人开发记录博客

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【项目实训】个人开发记录博客

神经网络模型以及数据问题

dataset和label可以用TensorDataset来转换为一个可以放入DataLoader的类

permute维度换位,为了适配网络参数输入顺序

解决问题,之前一直用的是torch.Tensor,现在知道tensor也要分类型了,一般图像的数据使用FloatTensor,标签使用LongTensor,这样就不会在计算loss的时候报数据类型的错误了

模型和数据都跑通了,那么接下来的任务就是像mnist那样对数据集进行分割了

参考对mnist数据集分割的代码:

def getDataSetAllocation(dataset_num=200,index=0):
    mnistDataSet = GetDataSet('mnist', True)

    # 测试集
    test_data = torch.tensor(mnistDataSet.test_data)
    test_label = torch.argmax(torch.tensor(mnistDataSet.test_label), dim=1)
    test_dataset = TensorDataset(test_data, test_label)

    # 训练集
    train_data = mnistDataSet.train_data
    train_label = mnistDataSet.train_label

    # 将训练集大小分割为客户端数量
    shard_size = mnistDataSet.train_data_size // dataset_num // 2
    shards_id = np.random.permutation(mnistDataSet.train_data_size // shard_size)

    shards_id1 = shards_id[index * 2]
    shards_id2 = shards_id[index * 2 + 1]
    data_shards1 = train_data[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
    data_shards2 = train_data[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
    label_shards1 = train_label[shards_id1 * shard_size: shards_id1 * shard_size + shard_size]
    label_shards2 = train_label[shards_id2 * shard_size: shards_id2 * shard_size + shard_size]
    local_data, local_label = np.vstack((data_shards1, data_shards2)), np.vstack((label_shards1, label_shards2))
    local_label = np.argmax(local_label, axis=1)
    train_dataset = TensorDataset(torch.tensor(local_data), torch.tensor(local_label))

    # 返回类型均为TensorDataset类型,还需要进一步封装入DataLoader
    return train_dataset,test_dataset
从model中加载参数
model.load_state_dict(torch.load(model_file_name, map_location=cuda_name))
django与mysql操作 数据库配置

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test1', #数据库名称
        'USER': 'user1', 
        'PASSWORD': 'chy352196487!',
        'HOST': 'rm-bp1ocx5t725vc9t85fo.mysql.rds.aliyuncs.com',#数据库地址
        'POST': 3306
    }
}
接下来是项目目录下的init.py
import pymysql
pymysql.install_as_MySQLdb()
接着把数据库里的表映射到models里面
python manage.py inspectdb>app_name/models.py

文件操作与bytes数据处理

strb = ''
strb = strb.encode()
with open("img/img1.jpg", "rb") as f:
    # 循环读取一张图片,一次性读取1024个字节
    while True:
        strb += f.read(1024)
        if strb == b"":
            break

接下来尝试使用django往binaryfiled字段存入文件

insert函数

修改原本已经测试 成功的insert函数 尝试访问地址

def insert(request):
    # 随机整数 作为学号
    # for i in range(0, 5):
    #     # 从models文件中获取student对象
    #     hello = Hello()
    #     # 给对象赋值
    #     hello.asd = str(i)
    #     hello.dsa = str(i)
    #     # 插入数据
    #     hello.save()
    strb = ''
    strb = strb.encode()
    with open("img/img1.jpg", "rb") as f:
        # 循环读取一张图片,一次性读取1024个字节
        while True:
            a = f.read(1024)
            strb += a
            if a == b"":
                break
    fileTest = Filetest()
    fileTest.file1 = strb
    fileTest.save()

    return HttpResponse('数据插入完毕')

结果报了一个文件找不到的错误

尝试打印一下当前目录地址

参考代码:

import sys
 
print sys.argv[0]#获得的是当前执行脚本的位置(若在命令行执行的该命令,则为空)12

打印结果:

也就是说路径应该是与manage.py处于同一级别的目录下的

在原本基础上加一个app1的路径试试

成功插入!!!

接下来就是研究取出来的问题了

为了便于数据库查询 我给数据库表添加了一项id

当前有一条数据项,是我刚刚添加的文件以及随便写的一个id

在view.py中添加如下代码,并配置路由,访问localhost:8080/find/

即可执行如下代码

find函数
def find(request):
    #sql = 'select * from student'
    # django 也可以执行原生的sql语句
    #result = Student.objects.raw(sql)

    # 查询name = tom1的数据
    # result = Student.objects.filter(name='tom1')
    result = Asd.objects.filter(id=1)
    """
    result为的对象
    需要进行数据处理
    """
    arr = []
    for i in result:
        content = {'文件': i.file, 'ID': i.id}
        arr.append(content)

        #把i.file1字节流写入新的文件f2
        with open("app1/img/img1_copy.jpg", "wb") as f2:
            f2.write(i.file)

    print(arr)
    print(type(arr))
    return HttpResponse('数据下载完毕')

通过debug可以看到在循环i中获取到的file1属性是一个字节流bytes类型,接下来我们就拿它开刀,将字节流写入某个位置

在find函数中添加写入文件的部分

成功!!!

使用save来update看
k = Example.objects.get(id=481)

k.total_calories = 12

k.save()
非django下的操作

目前已解决django和mysql的文件存取问题,但是由于聚合端并未使用django,所以再接着研究一下如何在非jango框架下进行文件存取操作

#此处为取操作
import pymysql
conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', db='django', password='chy352196487')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
cursor.execute("select * from filetest")
rows = cursor.fetchall()
sql语法

需要使用原生sql(放一张图免得忘记怎么写)

示例 update

from pymysql import *


def main():
    # 创建connection连接
    conn = connect(host='', port=3306, database='', user='',
                   password='', charset='utf8')
    # 获取cursor对象
    cs1 = conn.cursor()
    # 执行sql语句
    query = "update 表名 set 字段1 = 值1 where 字段2 = '{}'".format(值2)
    cs1.execute(query)

    # 提交之前的操作,如果之前已经执行多次的execute,那么就都进行提交
    conn.commit()

    # 关闭cursor对象
    cs1.close()
    # 关闭connection对象
    conn.close()


if __name__ == '__main__':
    main()

通过debug可以看出取出来的rows里面也能获取到文件的字节流,这就和前面的模块联系起来了

Pymyql模块的execute()总结 python写法
#! python3
# @Project:  mysite - sqlhelper.py
# @Info   :  提取sql的基本方法
import pymysql
 
 
def get_connection():
    """连接数据库"""
    # 连接数据库
    connect = pymysql.Connect(
        host='localhost',
        port=3306,
        user='root',
        passwd='123456',
        db='test1',
        charset='utf8'
    )
    # 获取游标(指定获取的数据格式,这里设定返回dict格式)
    return connect, connect.cursor(cursor=pymysql.cursors.DictCursor)
 
 
def select_all(sql, args=None):
    """查询所有"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    results = cursor.fetchall()
    cursor.close()
    conn.close()
    return results
 
 
def select_one(sql, args):
    """查询一个"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    result = cursor.fetchone()
    cursor.close()
    conn.close()
    return result
 
 
def update(sql, args):
    """修改数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
 
def create(sql, args):
    """新增数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
 
def delete(sql, args):
    """删除数据"""
    conn, cursor = get_connection()
    cursor.execute(sql, args)
    conn.commit()
    cursor.close()
    conn.close()
 
sql写法
insert into teacher(name) values (%s) 正确
官方文档

模块化

接下来是模块化的工作,这里定义一下需要模块化的功能

1、输入字节流,存入到path中文件

2、输入文件path,获取字节流

def get_bytes_from_path(path):
    strb = ''
    strb = strb.encode()
    with open(path, "rb") as f:
        # 循环读取一张图片,一次性读取1024个字节
        while True:
            strb += f.read(1024)
            if strb == b"":
                break
    return strb

3、输入path,更新数据库文件

def update_db_model2(path):
    file = get_bytes_from_path(path)
    k = Asd.objects.get(id=1)
    k.file = file
    k.save()

4、根据id从数据库获取model文件并加载到模型上

format函数用法

print('{我}今天{action}'.format(我='拦路雨',action ='在写博客'))  # 通过关键字

购买阿里云MysqlRDS服务后也在远程连接上测试成功

Django模板(环境移植)问题:
pip install django-bootstrap3
套用到目前已有的框架上

每次得到聚合端返回后对数据库中的model进行更新,默认id为1

首先是在现有框架上配置数据库

当前进度

在原有项目框架下,django后端与数据库的文件已交互完成

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/840285.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号