最近闲来无事,想着把自己工作正在做的一个项目做一个简单的分享与实战教程,该项目不困难但是由于涉及要素过多所以比较复杂。所以这里分享出来也是为了帮助新手小白能在实战当中快速了解python知识。主要内容涉及Python、HTML5、JavaScript、云计算、AI等。
在本教程完成更新后会放出源码哦~
如果有大佬发现问题,也非常欢迎指教
上期回顾
上期我们完成了内容库的UI及功能设计,这期我们来讲讲如何让内容自动入库。
内容入库
未来我们的应用场景主要是从各方汇聚而来的资源自动地汇聚到存储上的某一个文件夹当中,但是文件进来了我们的系统是不知道的,所以这里我们将建设一个自动扫描程序让媒体文件可以自动入库。
介绍一下整体思路:
- 首先我们确定一个特定的文件名前缀如"aizou0629_",如果文件没有该前缀,那我们就将该文件进行一个入库操作同时将该文件的文件名加上这个前缀,这样可以方便我们不用重复查询数据库判断某一个文件是否入库
- 但是这种情况下也会出现如果有相同文件名,但是先入库的文件前缀已经加上"aizou0629_",后入库的文件如果加上相同的前缀就会发生冲突。所以这里我们做一个判断语句,如果发现文件名重复的情况,程序修改文件名后缀加上(1),如"test.mp4"--> "test(1).mp4",后续如还有重复文件会加上(2)、(3)、(4) ...。
- 然后将所有需入库的文件名、路径、大小等信息放到同一个list里面,连接数据库并向数据库写入信息
- 入库完成
为实现以上效果,代码如下:
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个同名文件,都顺利导入到系统当中了!
如果文章帮助到了您,可否给一个点赞关注收藏呢~
如果遇到编程上的问题,欢迎留言哦~
关注作者回复:aiweb,获取源码下载地址哦~