1. 缘起
上周男票说自己在整理网盘资料的时候,发现资料太多,整理起来很麻烦,问我能不能帮他写个程序把网盘里的文件目录全部导出来存为Excel文件,这样就能够知道网盘里的全部目录结构了。
于是,作为一个傲娇的程序媛,怎么能够放弃在自己帅气男票面前显摆的机会能?故便欣然答应了。在网上百度搜索了一番,在中发现了一篇现成的代码分享Python | 用蟒蛇代码导出百度网盘文件目录,便花了几分钟照着该分享写了一个小程序,打包为exe可执行文件,给男票发了过去。原本以为他会很满意,正等着他来夸我来呢,结果,他竟然当起了甲方,挑起了刺,说:程序是导出了所有的文件目录,但要是能够指定导出文件的级别就好了(比如说我只想导出二级目录,程序只导出二级目录......)。虽然自己气到爆炸,但是作为一枚有修养的程序媛,还是乖乖的去改需求了。
2. 经过
参考了Python | 用蟒蛇代码导出百度网盘文件目录的代码,我第一次发现原来百度云盘在用户端本地有文件缓存的数据库文件,而且使用的数据库是sqlite3,该程序的思路是:给出文件缓存的数据库文件,然后读取出数据库文件中的内容,再按照文件夹目录的形式写到csv文件中。
1. DB的文件名:BaiduYunCacheFileV0.db,在百度云盘安装的路径中,
2.我的参考路径:
\baidu\BaiduNetdisk\users\34ff153956ff308c032b17809da08081\
详细的代码如下(时间有限+能力不足=>代码很low,但是功能都实现了):
"""
__title__ = ''
__author__ = 'yonghui Luo'
__mtime__ = '2019-02-27'
"""
#!/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
def set_degree(value):
global input_degree
input_degree = value
def select_db_file():
db_file = askopenfilename(title="请选择BaiduYunCacheFileV0.db文件", filetypes=[('db', '*.db')])
db.set(db_file)
print("run select_db_file end!")
def select_save_file():
save_file = asksaveasfilename(filetypes=[('文件', '*.txt')])
f.set(save_file + ".txt")
print("run select_save_file end!")
def select_save_csv_file():
save_file = asksaveasfilename(filetypes=[('文件', '*.csv')])
f.set(save_file + ".csv")
print("run select_save_file end!")
def set_degree_value(*args):
value = comboxlist.get()
if value == "全部":
set_degree(100)
else:
set_degree(value)
print(input_degree)
def write_csv_file(file_dict, f, item, gap="", curr_degree=-1):
# print("degree=" + str(curr_degree) + " input_degree=" + str(input_degree))
tem_list = ["┣━"]
if item == "/":
f.write("━" + "/" + "\n")
for i in file_dict["/"]:
f.write("┣" + "━" + i + "\n")
i = item + i + "/"
if i in file_dict:
write_csv_file(file_dict, f, i, gap="┣━", curr_degree=1)
else:
curr_degree += 1
tem_list.insert(0, "┃ ")
gap = "┃ " + gap
for i in file_dict[item]:
tem_list.append(i)
f.write(gap + i + "\n")
i = item + i + "/"
if i in file_dict and curr_degree < int(input_degree):
write_csv_file(file_dict, f, i, gap, curr_degree=curr_degree)
def create_baiduyun_filelist():
print("start get baidun_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_csv_file(file_dict, fp, "/")
window = Tk()
window.geometry('600x300')
window.title('百度云文件列表生成工具')
db_select = Button(window, 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(window, 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(window, text='选择保存地址', command=select_save_csv_file)
save_path.grid(row=2, column=1, sticky=W, padx=(2, 0), pady=(2, 0))
f = StringVar()
file_path = Entry(window, width=80, textvariable=f)
file_path['state'] = 'readonly'
file_path.grid(row=2, column=2, padx=3, pady=3, sticky=W + E)
degree_button = Button(window, text='选择文件深度')
degree_button.grid(row=3, column=1, sticky=W, padx=(2, 0), pady=(2, 0))
input_degree = 100 #默认为所有的
comboxlist = Combobox(window, textvariable=input_degree)
comboxlist["values"] = ("全部", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
comboxlist.current(0) #选择第一个
comboxlist.bind("<>", set_degree_value) #绑定事件,(下拉列表框被选中时,绑定set_degree_value()函数)
comboxlist.grid(row=3, column=2, padx=3, pady=3, sticky=W + E)
print(input_degree)
create_btn = Button(window, text='生成文件列表', command=create_baiduyun_filelist)
create_btn.grid(row=4, column=1, columnspan=2, pady=(0, 2))
window.columnconfigure(2, weight=1)
window.mainloop()
程序运行:
结果:
3. 结果
刷刷的,花了一会儿功夫吧代码改好,测试通过,打包给男票发过去了。心想这次应该满足需求,会被他夸奖一番了吧。
正当我满心期待夸奖、沉浸在自己的幻想中时。男票打来电话,他在电话中小心翼翼的说:能不能再提个小小的意见?
我想都没想,就回了他:不能。哼,小姐姐也是有脾气的。
(由于已经满足了男票的需求,后面就没有再花时间去改男票提出的最后的意见啦)
4. 附件
可执行程序 下载