python百度网盘自动同步_10分钟内教你用Python实现多个文件自动上传到百度云

本文介绍了如何在Python 3.7和Win10环境下,通过bypy库实现百度网盘的文件自动上传。首先安装bypy并进行授权,然后创建bypy对象,建立远程文件夹并上传文件。代码示例展示了如何遍历指定文件夹及其子文件夹,将所有文件按原结构上传,并提供文件大小和上传时间的统计。文章还提及了可能的优化方案,如多线程和根据文件修改时间局部更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境说明

Python 3.7  和 win10系统

二、准备工作

首先我们需要安装一个包,在cmd命令行界面安装 bypy包。

pip install bypy

然后安装成功后,在命令行运行命令

bypy info

会弹出一些类似一下的界面,要求授权系统认证。不过因为我已经安装了,所以下面是显示我的网盘容量和现有量。具体的认证是在浏览器中输入命令行界面中的一行百度云链接,进入授权界面,复制授权码,重新回到命令行输入授权码。重新输入bypy info 就可以认证成功了。

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

三、代码部分

该bypy包快速上手只要三步:创建对象;创建文件夹,上传文件。

# 获取一个bypy对象,封装了所有百度云文件操作的方法

bp = ByPy()

# 百度网盘创建远程文件夹

bp.mkdir(remotepath = 'dir_name')

# 上传某一文件到百度云网盘对应的远程文件夹

# ondup中参数代表复制文件,默认值为'overwrite',指定'newcopy'不会覆盖重复文件

bp.upload(localpath= file["fileName"], remotepath= 'dir_name', ondup='newcopy')

利用这些性质,我写了一份代码,功能是将代码所在的上层文件夹以内的所有文件按原来的文件夹组织形式上传到百度云中。也就是说,如果你要上传一个文件夹内的所有文件,那么你可以把这份代码拷贝到文件夹里面,然后直接运行就会自动上传了。

代码如下:

from bypy import ByPy

import os

import time

import datetime

import threading

# 百度云存放文件的文件夹名

dir_name = "ByPy-test"

# 获取一个bypy对象,封装了所有百度云文件操作的方法

bp = ByPy()

# 百度网盘创建远程文件夹bypy-test

bp.mkdir(remotepath = dir_name)

# 函数作用:文件中的 \ 改为 /

# 函数输入:文件绝对路径

# 输出:文件绝对路径添加转义符后的结果

def changePath(filePath):

path = ""

for i in range(len(filePath)):

if filePath[i] != "\\":

path += filePath[i]

else:

path += "/"

return path

# 根据当前路径和文件夹路径得到相对路径

def relPath(filePath, topDir):

relativepath = ""

for i in range(len(filePath)):

if i < len(topDir) and filePath[i] == topDir[i]:

continue

relativepath += filePath[i]

#print ("相对路径" + relativepath)

return relativepath

# 函数作用:给出文件夹,得到所有文件的绝对路径

# 输入参数:当前文件夹的绝对路径

# 返回值:一个包含所有文件绝对路径,以及文件所在文件夹的大小的列表

def getFileList(file_dir):

fileList = []

top_dir = ""

checkFlag = False

for root, dirs, files in os.walk(file_dir):

#print(root) #当前目录路径

if checkFlag == False:

top_dir = root

checkFlag = True

#print(dirs) #当前路径下所有子目录

#print(files) #当前路径下所有非目录子文件

for file in files:

fileDict = dict(Path = changePath(relPath(root, top_dir)), fileName = file, createFlag = False)

fileList.append(fileDict) # 当前目录+文件名

#print(fileDict)

return fileList

#获取文件的大小,结果保留两位小数,单位为MB

def get_FileSize(filePath):

fsize = os.path.getsize(filePath)

fsize = fsize/float(1024*1024)

return round(fsize,2)

# 获取文件绝对路径列表

allFiles = getFileList(os.path.abspath('.'))

totalFileSize = 0 # 文件大小变量

start = datetime.datetime.now() # 计时开始

# 逐个上传

createFlag = {}

for file in allFiles:

#bp.upload(localpath=file, remotepath=dir_name, ondup='newcopy')

print("正在上传文件:" + file["fileName"])

if file["Path"] != "":

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"])

else:

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

print("\nupload ok")

传输速度还是可以的!

四、优化

1. 或许可以考虑一下多线程,或者多进程发送,在文件较大较多的时候,传输时间会少挺多的。

2. 可以统计文件的修改时间,按时间段来发送文件,达到局部更新的效果。

五、最后

emmm至于你说为啥放着客户端不用,写个鬼命令行,(⊙﹏⊙)好像也有道理哦,不过写着玩呗。写程序多好玩。

thx for reading.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值