前言
最近需要下个存在Google Drive上的数据集,用浏览器下载总是下一会就失败。最后想了个办法用python直接下,比浏览器下稳定很多。
本文灵感来自如何优雅的快速下载谷歌云盘的大文件 (二)
1、google drive
首先把要下载数据集文件夹的快捷方式存到云盘里
然后下载windows的google drive登陆之后,资源管理器中就会出现一个虚拟地址,打开可以看到刚刚存的快捷方式
2、代理挂上全局
建议用个稳定点的
3、跑下python
import os
import shutil
import time
def copy_with_progress(src, dst, max_retries=3):
total_size = os.path.getsize(src)
for attempt in range(max_retries):
copied_size = 0
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
while True:
buf = fsrc.read(1024 * 1024) # 每次读取 1MB
if not buf:
break
fdst.write(buf)
copied_size += len(buf)
percent = (copied_size / total_size) * 100
print(f"\r复制进度: {percent:.2f}% ({copied_size}/{total_size} 字节)", end="", flush=True)
print() # 打印一个换行
# 比较文件大小
dst_size = os.path.getsize(dst)
if dst_size == total_size:
print("文件大小匹配,复制成功。")
return True
else:
print(f"文件大小不匹配。源文件: {total_size} 字节,目标文件: {dst_size} 字节")
if attempt < max_retries - 1:
print(f"尝试重新复制(第 {attempt + 2} 次)...")
else:
print("达到最大重试次数。复制失败。")
return False
def copy_files(src_dir, dst_dir):
if not os.path.exists(dst_dir):
os.makedirs(dst_dir)
total_files = sum([len(files) for r, d, files in os.walk(src_dir)])
completed_files = 0
failed_files = []
skipped_files = []
for root, dirs, files in os.walk(src_dir):
for file in files:
src_path = os.path.join(root, file)
dst_path = os.path.join(dst_dir, os.path.relpath(src_path, src_dir))
# 确保目标目录存在
os.makedirs(os.path.dirname(dst_path), exist_ok=True)
# 检查目标文件是否存在,如果存在则比较大小
if os.path.exists(dst_path):
src_size = os.path.getsize(src_path)
dst_size = os.path.getsize(dst_path)
if src_size == dst_size:
print(f"跳过: {src_path} (文件已存在且大小相同)")
skipped_files.append(src_path)
completed_files += 1
continue
print(f"正在复制: {src_path} 到 {dst_path}")
print(f"进度: {completed_files + 1}/{total_files}")
try:
success = copy_with_progress(src_path, dst_path)
if not success:
print(f"警告: 无法成功复制 {src_path}")
failed_files.append(src_path)
except Exception as e:
print(f"复制 {src_path} 时出错: {e}")
failed_files.append(src_path)
completed_files += 1
return failed_files, skipped_files
if __name__ == "__main__":
src_dir = r"这里填刚刚存的快捷方式路径"
dst_dir = r"改为下载到哪"
start_time = time.time()
failed_files, skipped_files = copy_files(src_dir, dst_dir)
end_time = time.time()
print(f"\n复制过程完成。总用时: {end_time - start_time:.2f} 秒")
if failed_files:
print("\n以下文件复制失败:")
for file in failed_files:
print(file)
else:
print("\n所有需要复制的文件复制成功。")
if skipped_files:
print(f"\n跳过了 {len(skipped_files)} 个文件 (已存在且大小相同)。")
逐个把文件copy出来,这里简单加了跳过已完成的文件和失败重试,一遍遍跑直到下完就行,也可以一直循环到全部下好