从零开始打造云端AI管理调度平台(八)文件自动入库

最近闲来无事,想着把自己工作正在做的一个项目做一个简单的分享与实战教程,该项目不困难但是由于涉及要素过多所以比较复杂。所以这里分享出来也是为了帮助新手小白能在实战当中快速了解python知识。主要内容涉及Python、HTML5、JavaScript、云计算、AI等。

在本教程完成更新后会放出源码哦~

如果有大佬发现问题,也非常欢迎指教

上期回顾

上期我们完成了内容库的UI及功能设计,这期我们来讲讲如何让内容自动入库。


内容入库

未来我们的应用场景主要是从各方汇聚而来的资源自动地汇聚到存储上的某一个文件夹当中,但是文件进来了我们的系统是不知道的,所以这里我们将建设一个自动扫描程序让媒体文件可以自动入库。

介绍一下整体思路:

  1. 首先我们确定一个特定的文件名前缀如"aizou0629_",如果文件没有该前缀,那我们就将该文件进行一个入库操作同时将该文件的文件名加上这个前缀,这样可以方便我们不用重复查询数据库判断某一个文件是否入库

  2. 但是这种情况下也会出现如果有相同文件名,但是先入库的文件前缀已经加上"aizou0629_",后入库的文件如果加上相同的前缀就会发生冲突。所以这里我们做一个判断语句,如果发现文件名重复的情况,程序修改文件名后缀加上(1),如"test.mp4"--> "test(1).mp4",后续如还有重复文件会加上(2)、(3)、(4) ...。

  3. 然后将所有需入库的文件名、路径、大小等信息放到同一个list里面,连接数据库并向数据库写入信息

  4. 入库完成

为实现以上效果,代码如下:

import os
import pymysql
import time
import copy


def scan_files(directory):
    files_list = []

    for root, sub_dirs, files in os.walk(directory):
        for special_file in files:
            tmp = []
            if (special_file.split('_')[0] != 'aizou0629'):

                #判断文件完全写入才进行后续操作
                if (isFinished(os.path.join(root, special_file))):

                    #判断文件是否出现重名
                    if ('aizou0629_' + special_file in files):
                        tmpname = copy.deepcopy(special_file)
                        flag=1
                        while 1:
                            if('aizou0629_' +special_file.replace('.', '('+str(flag)+').') not in files):
                                special_file=special_file.replace('.', '('+str(flag)+').')
                                os.rename(os.path.join(root, tmpname), os.path.join(root, special_file))
                                break
                            else:
                                flag+=1

                    #开始搜集需入库的文件列表
                    tmp.append(special_file)
                    tmp.append(cal_size(os.path.join(root, special_file)))
                    timearray = time.localtime(os.path.getctime(os.path.join(root, special_file)))
                    tmp.append(time.strftime("%Y-%m-%d %H:%M:%S", timearray))
                    files_list.append(tmp)

    if (len(files_list) == 0):
        return 0

    conn = pymysql.connect(host='localhost',
                           user='root',
                           password='',#修改为你的数据库密码
                           database='test')
    cursor = conn.cursor()
    for each in files_list:
        path = str(os.path.join(root, 'aizou0629_' + each[0]))
        NewPath = ""
        for each_1 in path.split("\\"):
            NewPath += each_1 + "\\\\"
        NewPath = NewPath[:len(NewPath) - 2]
        sql = "insert into mainbody_content_media (create_time,name,size,path) values ('{}','{}','{}','{}')".format(
            each[2], each[0], each[1], NewPath)
        cursor.execute(sql)
        file_rename(root, each[0])
    conn.commit()
    cursor.close()
    conn.close()
    return files_list


# 修改文件大小格式,使其更符合阅读习惯
def cal_size(path):
    flag = 1
    unit_dict = {1: 'B', 2: 'KB', 3: 'MB', 4: 'GB', 5: 'TB'}
    size = os.path.getsize(path)
    while 1:
        if (size > 1024):
            size = size / 1024
            flag += 1
        else:
            return str(round(size, 2)) + unit_dict[flag]


# 判断外来文件是否已完全拷贝到存储中
def isFinished(path):
    tmp = []
    while 1:
        size = os.path.getsize(path)
        if (size in tmp):
            tmp.append(size)
        else:
            del tmp
            tmp = [size]
        if (len(tmp) == 3):
            return True
        time.sleep(10)


def file_rename(root, filename):
    filename_new = 'aizou0629_' + filename
    os.rename(os.path.join(root, filename), os.path.join(root, filename_new))


if __name__ == "__main__":
    path = r'D:\PythonWorkspace\MyFirstDjango\mysite\content_media\origin'
    while 1:
        try:
          scan_files(path)
        except:
          print("错误")

        time.sleep(5)

测试一下

入库了4个同名文件,都顺利导入到系统当中了!


如果文章帮助到了您,可否给一个点赞关注收藏呢~

如果遇到编程上的问题,欢迎留言哦~

关注公众号:跟着皮皮实战python

关注公众号回复:aiweb,获取项目源码

了解最新最全的python实战内容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值