一、环境说明
Python 3.7 和 win10系统
二、准备工作
首先我们需要安装一个包,在cmd命令行界面安装 bypy包。
pip install bypy
然后安装成功后,在命令行运行命令
bypy info
会弹出一些类似一下的界面,要求授权系统认证。不过因为我已经安装了,所以下面是显示我的网盘容量和现有量。具体的认证是在浏览器中输入命令行界面中的一行百度云链接,进入授权界面,复制授权码,重新回到命令行输入授权码。重新输入bypy info 就可以认证成功了。


登录百度网盘,就可以看到出现了下列的文件夹。由于API限制,所有文件只能存在该文件夹中。

三、代码部分
该bypy包快速上手只要三步:创建对象;创建文件夹,上传文件。
# 获取一个bypy对象,封装了所有百度云文件操作的方法 bp.mkdir(remotepath = 'dir_name') # ondup中参数代表复制文件,默认值为'overwrite',指定'newcopy'不会覆盖重复文件 bp.upload(localpath= file["fileName"], remotepath= 'dir_name', ondup='newcopy')
利用这些性质,我写了一份代码,功能是将代码所在的上层文件夹以内的所有文件按原来的文件夹组织形式上传到百度云中。也就是说,如果你要上传一个文件夹内的所有文件,那么你可以把这份代码拷贝到文件夹里面,然后直接运行就会自动上传了。
代码如下:
# 获取一个bypy对象,封装了所有百度云文件操作的方法 bp.mkdir(remotepath = dir_name) def changePath(filePath): for i in range(len(filePath)): def relPath(filePath, topDir): for i in range(len(filePath)): if i < len(topDir) and filePath[i] == topDir[i]: relativepath += filePath[i] #print ("相对路径" + relativepath) # 返回值:一个包含所有文件绝对路径,以及文件所在文件夹的大小的列表 def getFileList(file_dir): for root, dirs, files in os.walk(file_dir): #print(files) #当前路径下所有非目录子文件 fileDict = dict(Path = changePath(relPath(root, top_dir)), fileName = file, createFlag = False) fileList.append(fileDict) # 当前目录+文件名 def get_FileSize(filePath): fsize = os.path.getsize(filePath) fsize = fsize/float(1024*1024) allFiles = getFileList(os.path.abspath('.')) totalFileSize = 0 # 文件大小变量 start = datetime.datetime.now() # 计时开始 #bp.upload(localpath=file, remotepath=dir_name, ondup='newcopy') print("正在上传文件:" + file["fileName"]) bp.mkdir(remotepath = dir_name + file["Path"]) DIR_NAME = dir_name + file["Path"] bp.upload(localpath= "." + file["Path"]+ "/" +file["fileName"], remotepath = str(DIR_NAME), ondup='newcopy') print ("文件发送完成:本地路径:" + file["Path"]+"/" +file["fileName"] + " 远程文件夹:" + DIR_NAME) totalFileSize += get_FileSize( "." + file["Path"]+ "/" +file["fileName"]) bp.upload(localpath= file["fileName"], remotepath= dir_name, ondup='newcopy') print ("文件发送完成:" + file["fileName"] + " 远程文件夹:" + dir_name) totalFileSize += get_FileSize( "." + file["Path"]+ "/" +file["fileName"]) print ("------------------------------------") end = datetime.datetime.now() # 计时结束 print("上传文件总大小为" + str(totalFileSize) + "MB") print("花费时间(s):" + str((end - start).seconds))

传输速度还是可以的!
四、优化
1. 或许可以考虑一下多线程,或者多进程发送,在文件较大较多的时候,传输时间会少挺多的。
2. 可以统计文件的修改时间,按时间段来发送文件,达到局部更新的效果。
五、最后
emmm至于你说为啥放着客户端不用,写个鬼命令行,(⊙﹏⊙)好像也有道理哦,不过写着玩呗。写程序多好玩。
thx for reading.
|