文章目录

  • 代码分析
    • 核心函数
    • 连接数据库提取内容
    • 主函数
    • grid()方法相关参数
    • 整体代码
    • 运行结果

当网盘文件超过100G的时候,找文件就有点苦恼了,不记得放在什么文件夹,也不记得名字,就想着从目录着手。
现在百度网盘还未推出目录功能,这里就套用网上推荐的查询目录的方式。后面附有代码。
#整体思路
##查看网盘缓存数据库文件
百度网盘在本地有个数据库文件 BaiduYunCacheFileV0.db,里面存放着文件路径和文件名等信息,两者结合提取出目录信息。该文件可以用Navicat Premium 15打开。

代码分析

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter.ttk import *
import sqlite3

这里用到了用于GUI图形界面开发的库,Tkinter 模块(Tk 接口),其中Tkinter filedialog是文件对话框控件。由于tkinter模块下的组件,整体风格较老较丑,同时也导入了组件更加美观、功能更加强大的ttk 组件。ttk新增了 LabeledScale( 带标签的Scale)、Notebook( 多文档窗口)、Progressbar(进度条)、Treeview(数)等组件。

def select_db_file():  db_file = askopenfilename(title="请选择BaiduYunCacheFileV0.db文件",filetypes=[('db', '*.db')])  db.set(db_file)  def select_save_file():  save_file = asksaveasfilename(filetypes=[('文件', '*.txt')])  f.set(save_file+".txt")

StringVar的作用,我们在使用界面编程的时候,有些时候是需要跟踪变量的值的变化,以保证值的变更随时可以显示在界面上。由于python无法做到这一点,所以使用了tcl的相应的对象,也就是StringVar、BooleanVar、DoubleVar、IntVar

  • StringVar类型需要通过StringVar.set()写入string字符串内容。
  • StringVar类型需要通过StringVar.get()读取内容,返回一个string字符串

askopenfilename返回文件名,是string字符串类型
select_db_file()函数巧妙的是,它把StringVar变量的声明写在了函数的外面且后面出现,而不是函数内部,呀呀,就是不能写在函数内部,在函数外面才是全局变量。
当然也可以理解为回调函数,当按钮被点击时,变量就存在了,不用担心它声明在后面

核心函数

def write_file(file_dict,f,item,gap=""):  if item=="/":  f.write("━" + "/" + "\n")  for i in file_dict["/"]:  f.write("┣" + "━" + i + "\n")  i = item + i + "/"  if i in file_dict:  write_file(file_dict,f,i, gap="┣━")  else:  gap = "┃  " + gap  for i in file_dict[item]:  f.write(gap + i + "\n")  i = item + i + "/"  if i in file_dict:  write_file(file_dict,f,i,gap)

递归函数write_file(file_dict,f,item,gap=""),参数分别是存放路径和对应文件的字典file_dict,f是待写入内容的txt文件,item是路径,gap是间隙

函数主体分析:如果路径item是最外层的路径,就将最外层路径对应的文件名,写入到f文件中,然后根据文件名重新赋值一个新路径,判断这个新路径是否在字典中,如果在,就递归调用该函数,检查文件名是否是文件夹(也就是文件名包装后的新路径在字典中)

如果路径不是根路径,每次调用函数gap会变化,将新路径对应的文件名,写入到f文件中,然后在文件名前面加上上一级路径后面加上/,赋值一个新路径,在字典中检查,也就是判断该文件名变成路径后,是否还有下一级路径,如果字典中有它
就表示有下一级路径,然后继续调用该函数。

连接数据库提取内容

def create_baiduyun_filelist():  file_dict = {}  conn = sqlite3.connect(db.get()) cursor = conn.cursor()  cursor.execute("select * from cache_file")  while True:  value = cursor.fetchone()  if not value:  break  path = value[2]  name = value[3]  size = value[4]  isdir = value[6]  if path not in file_dict:  file_dict[path] = []  file_dict[path].append(name)  else:  file_dict[path].append(name)  with open(f.get(),"w",encoding='utf-8') as fp:  write_file(file_dict,fp,"/")  conn.close()

conn = sqlite3.connect(db.get())连接数据库,db是StringVar类型,需要通过db.get()读取db里的内容,返回string类型的字符串,这里是地址+数据库文件名

cursor = conn.cursor() 使用 cursor() 方法创建一个游标对象,游标对象用于执行查询和获取结果
cursor.execute("select * from cache_file") 使用 execute() 方法执行 SQL 查询,SQL语句和BaiduYunCacheFileV0.db里的表格结构有关系,它里面有张叫cache_file的表

value = cursor.fetchone() fetchone() 获取下一个查询结果集。结果集是一个对象
conn.close()关闭数据库连接

主函数

root = Tk()
root.title('百度云文件列表生成工具')
db_select = Button(root, text=' 选择DB文件 ',command=select_db_file)
db_select.grid(row=1,column=1,sticky=W,padx=(2,0),pady=(2,0))
db = StringVar()
db_path = Entry(root,width=80,textvariable = db)
db_path['state'] = 'readonly'
db_path.grid(row=1,column=2,padx=3,pady=3,sticky=W+E)
save_path = Button(root, text='选择保存地址',command=select_save_file)
save_path.grid(row=2,column=1,sticky=W,padx=(2,0),pady=(2,0))
f = StringVar()
file_path = Entry(root,width=80,textvariable = f)
file_path['state'] = 'readonly'
file_path.grid(row=2, column=2,padx=3,pady=3,sticky=W+E)
create_btn = Button(root, text='生成文件列表',command=create_baiduyun_filelist)
create_btn.grid(row=3,column=1,columnspan=2,pady=(0,2))
root.columnconfigure(2, weight=1)
root.mainloop()

root = Tk() 调用窗口函数,实例化一个窗口对象
root.title('百度云文件列表生成工具') 窗口最顶部显示的文字

db_select = Button(root, text=' 选择DB文件 ',command=select_db_file) 在窗口上创建一个button,调用一个按钮,command代表点击按钮发生的事件

padx,pady:与之并列的组件之间的间隔,x方向和y方向,默认单位是像素

db_select.grid(row=1,column=1,sticky=W,padx=(2,0),pady=(2,0)) 设置按钮的位置,在第一行第一列,padx=(2,0) ,与之并列的组件之间的间隔,水平方向上,button与左边的组件,距离是2个像素,与右边的组件,距离是0像素。

如果不调用Button的grid函数,它将不会显示。sticky=W靠左边。

sticky:有点类似于 pack() 方法的 anchor 选项,同样支持 N(北,代表上)、E(东,代表右)、S(南,代表下)、W(西,代表左)、NW(西北,代表左上)、NE(东北,代表右上)、SW(西南,代表左下)、SE(东南,代表右下)、CENTER(中,默认值)这些值。

db = StringVar()StringVar是Tk库内部定义的字符串变量类型,改变StringVar,按钮上的文字也随之改变。
db_path = Entry(root,width=80,textvariable = db) TKinter输入类(TKinter文本框)获取用户输入,TKinter Entry类创建文本框,把变量db绑定到Entry

db_path['state'] = 'readonly' 变量db绑定Entry后,Entry状态变为只读

root.columnconfigure(2, weight=1) 列属性设置

root.mainloop()此函数调用窗口的无限循环,因此窗口将等待任何用户交互,直到我们将其关闭。

grid()方法相关参数

选项 说明 取值范围
column 单元格的列号 从0开始的正整数column
columnspan 跨列,跨越的列数 正整数
row 单元格的行号 从0开始的正整数
rowspan 跨行,跨越的行数 正整数
ipadx, ipady 设置子组件之间的间隔,x方向或者y方向,默认单位为像素 非负浮点数,默认0.0
padx,pady 与之并列的组件之间的间隔,x方向或者y方向,默认单位是像素 非负浮点数,默认0.0
sticky 组件紧贴所在单元格的某一角,对应于东南西北中以及4个角 N/S/W/E, NW/SW/SE/NE, CENTER(默认)

整体代码

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
from tkinter import *
from tkinter.filedialog import askopenfilename
from tkinter.filedialog import asksaveasfilename
from tkinter.ttk import *
import sqlite3def select_db_file():  db_file = askopenfilename(title="请选择BaiduYunCacheFileV0.db文件",filetypes=[('db', '*.db')])  db.set(db_file)  def select_save_file():  save_file = asksaveasfilename(filetypes=[('文件', '*.txt')])  f.set(save_file+".txt")  def write_file(file_dict,f,item,gap=""):  if item=="/":  f.write("━" + "/" + "\n")  for i in file_dict["/"]:  f.write("┣" + "━" + i + "\n")  i = item + i + "/"  if i in file_dict:  write_file(file_dict,f,i, gap="┣━")  else:  gap = "┃  " + gap  for i in file_dict[item]:  f.write(gap + i + "\n")  i = item + i + "/"  if i in file_dict:  write_file(file_dict,f,i,gap)  def create_baiduyun_filelist():  file_dict = {}  conn = sqlite3.connect(db.get())  cursor = conn.cursor()  cursor.execute("select * from cache_file")  while True:  value = cursor.fetchone() if not value:  break  path = value[2]  name = value[3]  size = value[4]  isdir = value[6]  if path not in file_dict:  file_dict[path] = []  file_dict[path].append(name)  else:  file_dict[path].append(name)  with open(f.get(),"w",encoding='utf-8') as fp:  write_file(file_dict,fp,"/")  conn.close()root = Tk()
root.title('百度云文件列表生成工具')
db_select = Button(root, text=' 选择DB文件 ',command=select_db_file)
db_select.grid(row=1,column=1,sticky=W,padx=(2,0),pady=(2,0))
db = StringVar()
db_path = Entry(root,width=80,textvariable = db)
db_path['state'] = 'readonly'
db_path.grid(row=1,column=2,padx=3,pady=3,sticky=W+E)
save_path = Button(root, text='选择保存地址',command=select_save_file)
save_path.grid(row=2,column=1,sticky=W,padx=(2,0),pady=(2,0))
f = StringVar()
file_path = Entry(root,width=80,textvariable = f)
file_path['state'] = 'readonly'
file_path.grid(row=2, column=2,padx=3,pady=3,sticky=W+E)
create_btn = Button(root, text='生成文件列表',command=create_baiduyun_filelist)
create_btn.grid(row=3,column=1,columnspan=2,pady=(0,2))
root.columnconfigure(2, weight=1)
root.mainloop()

运行结果

参考资料:
Python官方手册

批量获取百度网盘文件目录相关推荐

  1. python百度网盘获取群组信息失败_如何获取百度网盘群组邀请链接分享

    百度云网盘群组是一个广泛使用的功能,可以像qq群一样邀请大家进入,发送消息或者发送资源文件,特别是在分享链接容易出现审核失败,链接失效的情况下,通过建立群组来分享资源能够很好的避免资源失效的情况.以前 ...

  2. Java百度网盘创建链接,java获取百度网盘真实下载链接的方法

    本文实例讲述了java获取百度网盘真实下载链接的方法.分享给大家供大家参考.具体如下: 目前还存在一个问题,同一ip在获取3次以后会出现验证码,会获取失败,感兴趣的朋友对此可以加以完善. 返回的Lis ...

  3. 免费获取百度网盘会员一天的不限速网盘会员

    最近百度网盘推出了一个活动"领取免费VIP",该活动使得用户可以临时免费使用百度会员功能,对于想要不限速临时下载文件的用户来说是个福音.站长进行测试了下,下载一部电影总大小1.3个 ...

  4. JAVA获取百度网盘下载真实地址

    这是一个java写的获取百度网盘真实下载链接进行下载的程序.  程序里面一些参数拼接是根据浏览器抓包来的.具体的抓包方法网上一大堆,可以参考.这里给出了源码和导出的jar包.  url网址使用于百度分 ...

  5. 千方百计获取百度网盘下载链接

    千方百计获取百度网盘下载链接 重要的事情说三遍: 高手勿喷! 高手勿喷! 高手勿喷! 以前看过一篇帖子是在手机上获取百度云的下载链接然后在发送到电脑上, 这样的话百度云后台会判定为两次请求, 请求同一 ...

  6. 获取百度网盘下载真实地址

    这是一个java写的获取百度网盘真实下载链接进行下载的程序. 程序里面一些参数拼接是根据浏览器抓包来的.具体的抓包方法网上一大堆,可以参考.这里给出了源码和导出的jar包. url网址使用于百度分享的 ...

  7. python 百度网盘库 根据文件名获取网盘链接_GitHub - tychxn/baidu-wangpan-parse: 获取百度网盘分享文件的下载地址...

    百度网盘分享文件下载链接解析 功能 获取百度网盘分享文件的真实下载地址 将获取到的下载链接复制到IDM.FDM等下载器即可实现高速下载,避免使用百度网盘客户端 运行环境 Python3 (兼容Pyth ...

  8. 如何利用工具批量删除百度网盘单向好友

    百度网盘好友太多,不方便管理,并且有一大部份还是单向好友,消息也发不了,怎么找出来删除掉,下面介绍怎么操作实现这个目的. 一.首先百度下载网盘消息群发工具 二.在帐号管理中登录并获取COOKIE,保存 ...

  9. php服务器文件直链,如何获取百度网盘储存文件直链下载(PHP版)·站内下载

    百度网盘是百度推出的一项云存储服务,首次注册即有机会获得15GB的空间,目前有Web版.Windows客户端.Android手机客户端,用户将可以轻松把自己的文件上传到网盘上,并可以跨终端随时随地查看 ...

  10. python网盘提取码怎么用_Python 一键获取百度网盘提取码

    ''' 遇到python不懂的问题,可以加Python学习交流群:1004391443一起学习交流,群文件还有零基础入门的学习资料 ''' VERSION = "VERSION 1.0.0& ...

最新文章

  1. TimeUnit 使用
  2. 数据恢复工具PhotoRec
  3. MySQL利用xtrabackup进行增量备份详细过程汇总
  4. 【PP物料】物料主档备忘录
  5. 自定义水晶报表的显示
  6. d3.js 搭建 d3-force-directed-graph 例子
  7. amd服务器开启虚拟化,记一次 AMD 虚拟化 IOMMU 开启过程
  8. SSH整合所需的jar包
  9. element做树形下拉_Element input树型下拉框的实现代码
  10. 27_iOS干货19之网络4_在线http/https素材资源
  11. c语言知道坐标求圆面积,用C语言编程推算圆的面积公式
  12. Android开发——Kotlin语法之Lambda表达式
  13. 校友名录复旦计算机科学陆琪,寄语 | 致2017届小鲜肉:年年情相似,岁岁人不同...
  14. 哔哩哔哩20校招算法笔试题(2019.8.20)第二道编程题 AC
  15. java火车票售票系统,火车购票系统,系统实现了用户会员管理、火车车次管理、火车座位管理、系统公告管理、火车票退票、火车票换乘、换乘查询、直达查询、乘车人管理、订单管理、个人中心管理等
  16. CUMT-CTF第二次双月赛Writeup
  17. 「Python数据分析系列」10.使用数据
  18. 开源搜索引擎评估:lucene sphinx elasticsearch
  19. Problem Set 1
  20. 悬赏任务h5系统源码接单发单平台支持游戏试玩签到

热门文章

  1. 英语邮件中常用的礼貌用语
  2. Guava--Joiner使用方式以及java8实现Joiner
  3. 苏格拉底与那个失恋的孩子
  4. 正则表达式过滤联系方式,微信手机号QQ等
  5. 你要知道的内存条知识
  6. CentOS 7 : 一 、安装WeKan
  7. ArcGIS之定义投影
  8. Nucleus SE RTOS 中的中断
  9. 整理学习之多任务学习
  10. win 10 桌面路径还原到C盘拒绝访问