# -*- coding: utf-8 -*-
"""Spyder Editor"""
from __future__ import print_function
from os import walk, remove
import os
import re
import tkinter as tk
from tkinter import filedialog
import shutil #移动或复制文件
import sqlite3
import pandas as pd
import configparser
import shutil
import sys
root = tk.Tk()
root.withdraw()
#选择PDF备份的目录
back_dir = filedialog.askdirectory(title = '请选择PDF备份的目录:')
try:
from pathlib import Path
except ImportError:
from pathlib2 import Path
if sys.version_info.major == 2:
reload(sys)
sys.setdefaultencoding('UTF8')
def get_zotfile_dest_and_zotero_data_dirs():
'''Get the Zotero data dir and the Zotfile destination dir in PosixPath type'''
profile_dirs = {
'darwin': Path.home() / 'Library/Application Support/Zotero',
'linux': Path.home() / '.zotero/zotero',
'linux2': Path.home() / '.zotero/zotero',
'win32': Path.home() / 'AppData/Roaming/Zotero/Zotero'
}
profile_dir = profile_dirs[sys.platform]
config = configparser.ConfigParser()
config.read('{}'.format(profile_dir / 'profiles.ini'))
configs_loc = profile_dir / config['Profile0']['Path'] / 'prefs.js'
configs = configs_loc.read_text()
zotero_data_pat = re.compile(
r'user_pref\("extensions.zotero.dataDir",\ "(?P.+)"\);')
zotero_data_dir = Path(zotero_data_pat.search(
configs).group('zotero_data'))
zotfile_dest_pat = re.compile(
r'user_pref\("extensions.zotfile.dest_dir",\ "(?P.+)"\);')
zotfile_dest_dir = Path(
zotfile_dest_pat.search(configs).group('zotfile_dest'))
return zotero_data_dir, zotfile_dest_dir
if __name__ == '__main__':
#得到zotero数据目录和文件目录
zotero_data_dir, zotfile_dest_dir = get_zotfile_dest_and_zotero_data_dirs()
list_of_files = [] #文件包含目录
files = [] #仅文件名
for (dirpath, dirnames, filenames) in walk(zotfile_dest_dir):
for file in filenames:
if file.endswith('.pdf') == True:
list_of_files.append(os.path.join(dirpath, file))
files.append(file)
#连接数据库
zot_sqlite = os.path.join(zotero_data_dir, 'zotero.sqlite')
with sqlite3.connect(zot_sqlite) as con:
item_att=pd.read_sql_query("SELECT * FROM itemAttachments", con=con)
item_path = item_att['path']
#生成备份文件目录
#当文件不存在时,才创建该文件夹。
if not os.path.exists(back_dir):
os.mkdir(back_dir)
for i in range(len(files)):
#如zotero.sqlite的path中不包括文件
if not (item_path.str.contains(re.escape(files[i])).any()):
#os.remove(list_of_files[i]) #也可以删除文件
shutil.move(list_of_files[i], os.path.join(back_dir, files[i]))#移动文件到备份目录
print('已备份',files[i],'到',back_dir)