当网盘文件超过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文件