请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
yzm284932(uid:713489)
职业资格认证:尚未取得认证
图片透明化和图片
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 代码可以实现对 SQLite3的数据库查询,可更改数据库名,可修改查询 # 返回结果,如果是文件路径,可以单击打开 import sys, os, re, datetime, time, traceback import win32timezone   from tkinter import * import sqlite3 import pyautogui as auto import ctypes.wintypes import win32com.client from pptx import Presentation import openpyxl import base64 from PIL import Image, ImageTk from io import BytesIO     start_r = 0                 # 起始行 p_row=8                     # 每页显示的行数   DB_FILE = r'H:\FILE_00X.DB' # 默认的数据库文件 disk_Dir=r"H:\\"       class Application(Frame):     '''查询数据库 SQLite3, 并且打开文件'''     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack()         self.newWidget()     # 设计查询主界面     def newWidget(self):         global v         #self.config(bg='#434345')         Button(self, text="数据库文件:", font=('黑体', 12)).grid(row=0,column=0, sticky=W )         self.text_db=Text(self, width=40, height=1, bg='lightgray', font=('黑体', 16))         self.text_db.grid(row=1, column=0)         self.text_db.insert(1.0,DB_FILE)           Button(self, text="SQL代码区:", font=('黑体', 12)).grid(row=2,column=0, sticky=W)           self.text_in=Text(self, width=50, height=15, bg='wheat', font=('黑体', 16))         self.text_in.tag_config('red',foreground='red')         self.text_in.tag_config('blue',foreground='blue')         self.text_in.insert(END,     """SELECT ID,FILENAME,DT,TP,PATH,TM     FROM FILES     WHERE 1=1         -- 查询文件名,或发件人 --""")         self.text_in.insert(END,"\n    AND FILENAME LIKE '%%%'",'blue')         self.text_in.insert(END,"""     AND TP LIKE '%%%'     AND PATH LIKE '%%%'         -- 查询文件内容,关键字左右都要有% --""")         self.text_in.insert(END,"\n    AND CONTENT LIKE '%%%%%'",'blue')         self.text_in.insert(END,"\n    ORDER BY DT DESC")           self.text_in.insert(END,         """\n    --如果你熟悉SQL语句,     --可以把上面的全部删除,自己按要求写 :)         """,'red')         base64_string = 'iVBORw0KGgoAAAAAAAElFTkSuQmCC' ##        base64_white = b'iVBORw0KGgoBBOsAAAAASUVORK5CYII='         decoded_image_data = base64.b64decode(base64_string)         sien = ImageTk.PhotoImage(Image.open(BytesIO(decoded_image_data)))           self.text_in.grid(row=3, rowspan=6, column=0)         # 邮件保存 ##########################################################         self.btn01=Button(self, text="邮件保存", font=('黑体', 16), command=self.mail_write)         self.btn01.grid(row=3, column=1, sticky=N )           self.btn02=Button(self, text="查询", font=('黑体', 20), bg='#00aff0', command=self.query)         self.btn02.grid(row=0, column=1, sticky=W )         # 本地文件 ##########################################################         self.btn03=Button(self, text="文件更新", font=('黑体', 16), command=self.disk_check)         self.btn03.grid(row=4, column=1, rowspan=2, sticky=N )           self.label03=Label(self, text="腹有诗书气自华,云鹤孤鸷任天涯...", font=('黑体', 12))         self.label03.grid(row=11, column=0,  sticky=SE )         bt2=Label(self,image=sien)         bt2.image=sien         bt2.grid(row=11, column=1)           v = IntVar()   # 根据单选按钮的 value 值来选择相应的选项         v.set(0)         # 使用 variable 参数来关联 IntVar() 的变量 v         rd1 = Radiobutton(self, text="收件箱", fg='blue',font=('微软雅黑','12','bold'),variable=v, value=0)         rd2 = Radiobutton(self, text="所有邮箱", variable=v, value=1)           rd1.grid(row=6, column=1,  sticky=S)         rd2.grid(row=7, column=1,  sticky=N)         def query(self):         query = self.text_in.get(1.0, END).replace('FROM', ',CONTENT FROM')         print(query)         DB = self.text_db.get(1.0, END)         print(DB)         # 从Text组件获取的文本含有特殊字符,记得用 strip()去除掉         conn = sqlite3.connect(DB.strip())         cursor = conn.cursor()         cursor.execute(query)         rows = cursor.fetchall()         # 先要将 SQLite3 返回结果改为 List,默认是元组         rows =         # 获取返回数据的字段名         cols = for description in cursor.description]         conn.close()           # 将CONTENT的结果,匹配到 sheetname或PPT的页码数         # 并且将结果覆盖掉 CONTENT的原始数据         # 先要将 SQLite3 返回结果改为 List,默认是元组         chars1 = re.findall('(?<=CONTENT LIKE \'%).*(?=\')', query)         chars1 = chars1.strip('%')         chars1 = chars1.replace('%', '.*')         if chars1 == '': chars1 = '字符为空'         print(chars1)         for i2, descr in enumerate(cursor.description):             #print(descr)             if descr.upper() == 'CONTENT': content_i = i2             if descr.upper() == 'TP': TP_i = i2           print(content_i, TP_i)         for i1, row in enumerate(rows):             #print(rows)             if row == 'XLSX':                 final = rows.replace('SN:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'SN:')             if row == 'PPTX':                 final = rows.replace('PG:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'PG:')             if row == 'MSG':                 rows = 'NA'             global start_r         start_r = 0         self.show_result(cols, rows)       def open_F(self, event):         print('ok')         bg = event.widget.cget('bg')         file = event.widget.cget('text').replace('\\\\','\\')         if bg == 'white':            os.startfile(file)       def show_result(self, cols, rows):         geo_str='1500x600+200+200'         if wd > 2000: geo_str='2000x750+200+200'         result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry(geo_str)         start_r = 0         #result_window.attributes('-topmost', True)           # 局部函数, 销毁所有的 Label, 重写下一批, 背景色为 gold的标题行不销毁 ##########################         def dest(rows, fx):             global start_r             children = result_window.winfo_children()             start_r += fx*p_row             rows_all = len(rows)             if start_r >= rows_all: start_r = 0             if start_r < 0: start_r = int(rows_all/p_row-0.01)*p_row             LB = '返回数:'+ str(start_r) + ' / ' + str((len(rows)))             for ch in children:                 if isinstance(ch, Label) and ch.cget('bg') != 'gold':                    ch.destroy()             write_some(rows, fx)           # 局部函数, 每次写固定行数的返回结果, 到尾巴了从头开始 ##########################         def write_some(rows, fx):             global start_r             rows_all = len(rows)               for j, row in enumerate(rows):                 for i, cell in enumerate(row):                     #ht = int(text_wd_max/140+1)                     #print(text_wd_max, ht)                     lb = Label(result_window, text=cell, anchor=W, relief=RIDGE,                                          width=text_wd, height=3, wraplength=text_wd*7)                     lb.grid(row=j+2, column=i)                     if i == 4:                        lb.config(bg='white', fg='blue')             # 绑定事件, 判断是否可以打开文件             lb.bind_class('Label', '<Button-1>', self.open_F)             # 确认字符数量,以便设置Label宽度,字符最多为50个,<50则取所有行的最大值         text_wd=         text_wd_max=         for j, row in enumerate(rows):             for i, cell in enumerate(row):                 if len(str(cell).strip()) > text_wd:                    text_wd = len(str(cell).strip()) if len(str(cell).strip()) < 70 else 70                 if len(str(cell)) > text_wd_max:                     text_wd_max = len(str(cell).strip())         print(text_wd)           # 显示标题行,行高2个字符,wraplength的像素值 = 字符数 * 7         for i, col in enumerate(cols):             Label(result_window, text=col, anchor=W, relief=RIDGE,                                  width=text_wd, bg='gold', height=1, wraplength=text_wd*7).grid(row=1, column=i)           # 显示结果行         write_some(rows, 1)           # 调用销毁和重写下一批的功能, btn02 是销毁退出 Toplevel         btn01 = Button(result_window, text='下一页', font=('黑体', 15), command=lambda:dest(rows, 1))         btn01.grid(row=0, column=1)         btn03 = Button(result_window, text='上', font=('黑体', 15), command=lambda:dest(rows, -1))         btn03.grid(row=0, column=0)         btn02 = Button(result_window, text='退出关闭', font=('黑体', 15), command=lambda:result_window.destroy())         btn02.grid(row=0, column=2, padx=2)         LB = Label(result_window, text='返回数:'+str(len(rows)), bg='gold', font=('黑体', 15))         LB.grid(row=0, column=4, sticky=W )       def mail_write(self):         # 初始全局变量,定义数据库 ##########################################################         outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")         cnt = 0         cnt_ok=0         rep0 = 0         chk_Dir = r"H:\MAIL"         all_path = chk_Dir         file_cnt=0         global v           #检查文件夹是否存在,否则创建         if os.path.exists(chk_Dir) is False:             os.mkdir(chk_Dir)             os.mkdir(chk_Dir+r'\send')         else:             print('文件夹已经存在......很OK')           wd = auto.size().width         geo_str='700x500+600+200'         if wd > 2000: geo_str='900x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)           # 获取所有根级文件夹           root_folders = outlook.Folders           disk_set = set()         for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue             for file in files:                 f1 = os.path.join(root, file)                 disk_set.add(f1)               def folder_all(folder0,item0):             for f in folder0.Folders:                 check_v = 0                 try:                     if f.Restrict(""): check_v = 1                 except:                     pass                 if f.Folders.Count>0 and check_v == 1:                     folder_all(f,item0)                 item0.append(f.Items)           file_cnt = 0         vv = v.get()         # 遍历每一个根级文件夹及其子文件夹         for folder in root_folders:             for sub_folder in folder.Folders:                 item0=                 #if cnt_ok >2: exit()                 text.insert(END, folder.Name+'--'+sub_folder.Name+ '\n')                 text.update()                 if (folder.Name.find('.com') > -1 and sub_folder.Name not in ('已删除邮件','Deleted Items')) if vv==0 else \                                             (sub_folder.Name.find('删除')==-1 or sub_folder.Name.upper().find('DELETE')==-1):                     item0.append(sub_folder.Items)                     if sub_folder.Folders.Count>0:                         folder_all(sub_folder,item0)                         print('xxxxxxxxxxxxxxxxxxxxxxxx',len(item0))                     for mm in item0:                         try: mm.Sort("",True)                         except: pass                         rep0 = 0                         #Michael.Liu@sienidm.com                         for mail in mm:                             #break                             cnt+=1                               try:                                 sender=mail.SenderName                             except:                                 continue                               save_folder_path=all_path                             if sub_folder.Name in ('202203','已发送邮件','已发送','Send Items'):                                 sender=''                                 save_folder_path=all_path+r'\send' ##                            if sub_folder.Name=='收件箱': ##                                save_folder_path=all_path                               #sender=''                             # 获取邮件主题,以此做文件名,故需要去除文件名的非法字符                             mail_subject = re.sub(r'','_',mail.Subject.replace(' ',''))                             # 获取邮件创建时间                             mail_date = mail.CreationTime.strftime("%Y-%m-%d %H-%M-%S")                             # 转换为时间戳整数                             date2=time.mktime(mail.CreationTime.timetuple())                               # 构造保存文件路径                             save_file_path = os.path.join(save_folder_path,                                                     f'{sender}_{mail_subject}={mail_date}.msg')                             file = f'{sender}_{mail_subject}={mail_date}.msg'                             f1 = save_file_path                             #print(dir(mail))                             if save_file_path in disk_set:                                 if cnt%10 == 0:                                     text.insert(END, sub_folder.Name+'.....'+str(cnt)+'......Existsed........'+'\n')                                     text.see(END)                                     text.update()                                 rep0 += 1 ##                                if rep0 > 20:break                                 continue                                 #print(sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path)                             text.insert(END, sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path+'\n')                             text.see(END)                             text.update()                             # 将邮件保存到指定路径                             try:                                 mail.SaveAs(save_file_path)                                 os.utime(save_file_path,(date2,date2))                                 cnt_ok+=1                             except:                                 print(Exception)             #print(str(cnt_ok)+'   封邮件已保存')             text.insert(END, str(cnt_ok)+'   封邮件已保存, end......'+'\n')             text.see(END)             text.update()           self.extra(text)       def extra(self, text):         file_cnt=0         CNT0 = 0         file_size = 0           chk_Dir=r"H:\MAIL"         start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))         outlook = win32com.client.Dispatch("Outlook.Application")           file_no=           time.sleep(0.2)         text.insert(END, '\n\n\n\n开始写数据库................................\n\n'+'\n')         text.see(END)         text.update()             #if DB_FILE + chk_Dir not in ('D:\FILE_03.DBH:\MAIL', 'D:\FILE_MFG.DBS:\02_MFG'): exit()             ##def extract_text_from_msg(filepath):         ##    with open(filepath, 'rb') as f:         ##        msg = Message(f)         ##        msg_sender = msg.sender         ##        msg_subject = msg.subject         ##        msg_txt = ""         ##        for chunk in msg.body:         ##            if isinstance(chunk, bytes):         ##                msg_txt += chunk.decode('gb18030', errors='ignore')         ##            else:         ##                msg_txt += str(chunk)         ##        return msg_sender, msg_subject, msg_txt           # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')             # 读取数据库中的 MSG 文件,生产集合,以便判断,如果已经存在就不上传了         c.execute("SELECT PATH FROM FILES WHERE 1=1 ")         results = c.fetchall()         hist_set = set( for result in results])         disk_set = set()           for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue             for file in files:                 f1 = os.path.join(root, file)                 disk_set.add(f1)         diff_set=disk_set-hist_set           for f1 in diff_set:             file = os.path.basename(f1)             file_size += os.path.getsize(f1)             #f1 = f1.replace('\\._','\\')             ext = os.path.splitext(file)             ext = ext.upper()             CNT0 += 1                 # 解析   MSG  文件内容######################################################             content=''             if file.find('~$') == -1 and ext == '.MSG' and (0 if f1 in hist_set else 1):                 DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                 tm1=time.time()                 tp='MSG'                 file_cnt+=1                 #print(str(file_cnt)+"...发现修改文件:", f1)                 text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                 text.see(END)                 text.update()             # 解析 MSG 文件内容                 try:                     msg = outlook.CreateItemFromTemplate(f1)                     content = msg.Body                     if content == '': content = '正文是空'                 except:                     err=traceback.format_exc()                     print(Exception)                     file_no.append(f1+'\n'+err+'\n')                     pass                 if content == '': continue                 # 插入记录到数据库                 #print(content.replace('\n\r', ''))                 tm2=time.time()                 tm3=str(round(tm2-tm1,3))                 size=len(content)                 c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                             (DT_TM,tp,file, f1,tm3,size, content))                 conn.commit()                 #print('ok......')             end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           c.close()         conn.close()         #print('end.....................................')         #print('硬盘邮件总大小......' + str(int(file_size/1000/1000)), 'M')         text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, f'end........上传了....{file_cnt}  封邮件.........'+'\n')         text.insert(END, '硬盘邮件总大小......' + str(int(file_size/1000/1000))+ 'M'+'\n')         text.see(END)         text.update()       def disk_check(self):         tm00 = time.time()         file_cnt = 0         file_all = 0             start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           file_no=           wd = auto.size().width         geo_str='700x500+600+200'         if wd > 2000: geo_str='900x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)             # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')           c.execute('SELECT PATH FROM FILES')         results = c.fetchall()         file_hist = set(list(r for r in results))         file_new = set()               for root, dirs, files in os.walk(disk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                   #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 #print(f1,ext)                     # 解析   XLSX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.XLSX':                     size=int(os.path.getsize(f1)/1000/1000)                     #ipdb.set_trace()                     if size > 3:                         #file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                         text.insert(END, f1+'\n文件过大 '+str(size)+' M,跳过......\n'+'\n')                         text.see(END)                         text.update()                         continue                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                       DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='XLSX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                     # 解析xlxs文件内容                         # 打开Excel文件                     try:                         workbook = openpyxl.load_workbook(r'{}'.format(f1))                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             workbook = openpyxl.load_workbook(r'{}'.format(f1))                             file_new.add(f1)                         except:                             #print(Exception)                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                         # 获取所有非空白的工作表名                     try:                         sheet_names = .max_column > 0 and workbook.max_row > 0]                     except:                         text.insert(END, str(Exception)+'\n')                         text.see(END)                         text.update()                         err=traceback.format_exc()                         file_no.append(f1+'\n'+err+'\n')                         continue                       # 遍历每个工作表                     for sheet_name in sheet_names:                         # 获取工作表对象                         sheet = workbook                         # 获取最大行数和列数                         max_row = sheet.max_row                         max_column = sheet.max_column                         # 只取前100行的内容                         if max_row > 30:                             max_row = 30                         if max_column > 20:                             max_column = 20                           # 遍历每行和每列,获取单元格内容                         # 每个sheet把表名加在前面 SN:sheetname:                         content = content + ' SN:{}:'.format(sheet_name)                         for row in range(1, max_row+1):                             for column in range(1, max_column+1):                                 # 获取单元格内容                                 value=sheet.cell(row=row, column=column).value                                 if value is None:                                     continue                                 if str(value).find('=')>-1:                                     continue                                 if str(value).isnumeric():                                     continue                                 content = content + ',' + str(value)                       # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                   # 解析   PPTX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.PPTX':                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='PPTX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析pptx文件内容                     try:                         prs = Presentation(f1)                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             prs = Presentation(f1)                             file_new.add(f1)                         except:                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                       for pg, slide in enumerate(prs.slides):                         content += '\nPG:{}:'.format(str(pg))                         content += ','.join(paragraph.text for shape in slide.shapes if shape.has_text_frame                                         for paragraph in shape.text_frame.paragraphs)                         # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))             conn.close()           text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, str(time.time()-tm00)+'\n')         text.insert(END, f'共完成 ...{file_cnt}...个文件,存到数据库,请关闭此窗口'+'\n')         text.see(END)         text.update()         if __name__ == '__main__':     user = os.getlogin()     if user.upper() not in :         auto.confirm('您还没有授权测试,请联系他!!!')         sys.exit()     wd = auto.size().width     geo_str='650x500+600+200'     if wd > 2000: geo_str='850x600+600+200'       root = Tk()     root.title('文件_邮件管理_查询界面')     root.geometry(geo_str)     app = Application(master=root)     root.mainloop()  
文件和邮件FF
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 代码可以实现对 SQLite3的数据库查询,可更改数据库名,可修改查询 # 返回结果,如果是文件路径,可以单击打开 import sys, os, re, datetime, time, traceback import win32timezone sys.path.append(r"\\sienfs01\12inch_Fab\Pypak\PAK") from tkinter import * import sqlite3 import pyautogui as auto import ctypes.wintypes import win32com.client from pptx import Presentation import openpyxl import base64 from PIL import Image, ImageTk from io import BytesIO     start_r = 0                 # 起始行 p_row=8                     # 每页显示的行数   DB_FILE = r'H:\FILE_00X.DB' # 默认的数据库文件 disk_Dir=r"H:\\"       class Application(Frame):     '''查询数据库 SQLite3, 并且打开文件'''     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack()         self.newWidget()     # 设计查询主界面     def newWidget(self):         global v         #self.config(bg='#434345')         Button(self, text="数据库文件:", font=('黑体', 12)).grid(row=0,column=0, sticky=W )         self.text_db=Text(self, width=40, height=1, bg='lightgray', font=('黑体', 16))         self.text_db.grid(row=1, column=0)         self.text_db.insert(1.0,DB_FILE)           Button(self, text="SQL代码区:", font=('黑体', 12)).grid(row=2,column=0, sticky=W)           self.text_in=Text(self, width=50, height=15, bg='wheat', font=('黑体', 16))         self.text_in.tag_config('red',foreground='red')         self.text_in.tag_config('blue',foreground='blue')         self.text_in.insert(END,     """SELECT ID,FILENAME,DT,TP,PATH,TM     FROM FILES     WHERE 1=1         -- 查询文件名,或发件人 --""")         self.text_in.insert(END,"\n    AND FILENAME LIKE '%%%'",'blue')         self.text_in.insert(END,"""     AND TP LIKE '%%%'     AND PATH LIKE '%%%'         -- 查询文件内容,关键字左右都要有% --""")         self.text_in.insert(END,"\n    AND CONTENT LIKE '%%%%%'",'blue')         self.text_in.insert(END,"\n    ORDER BY DT DESC")           self.text_in.insert(END,         """\n    --如果你熟悉SQL语句,     --可以把上面的全部删除,自己按要求写 :)         """,'red')                 decoded_image_data = base64.b64decode(base64_string)         sien = ImageTk.PhotoImage(Image.open(BytesIO(decoded_image_data)))           self.text_in.grid(row=3, rowspan=6, column=0)         # 邮件保存 ##########################################################         self.btn01=Button(self, text="邮件保存", font=('黑体', 16), command=self.mail_write)         self.btn01.grid(row=3, column=1, sticky=N )           self.btn02=Button(self, text="查询", font=('黑体', 20), bg='#00aff0', command=self.query)         self.btn02.grid(row=0, column=1, sticky=W )         # 本地文件 ##########################################################         self.btn03=Button(self, text="文件更新", font=('黑体', 16), command=self.disk_check)         self.btn03.grid(row=4, column=1, rowspan=2, sticky=N )           self.label03=Label(self, text="腹有诗书气自华,云鹤孤鸷任天涯...", font=('黑体', 12))         self.label03.grid(row=11, column=0,  sticky=SE )         bt2=Label(self,image=sien)         bt2.image=sien         bt2.grid(row=11, column=1)           v = IntVar()   # 根据单选按钮的 value 值来选择相应的选项         v.set(0)         # 使用 variable 参数来关联 IntVar() 的变量 v         rd1 = Radiobutton(self, text="收件箱", fg='blue',font=('微软雅黑','12','bold'),variable=v, value=0)         rd2 = Radiobutton(self, text="所有邮箱", variable=v, value=1)           rd1.grid(row=6, column=1,  sticky=S)         rd2.grid(row=7, column=1,  sticky=N)         def query(self):         query = self.text_in.get(1.0, END).replace('FROM', ',CONTENT FROM')         print(query)         DB = self.text_db.get(1.0, END)         print(DB)         # 从Text组件获取的文本含有特殊字符,记得用 strip()去除掉         conn = sqlite3.connect(DB.strip())         cursor = conn.cursor()         cursor.execute(query)         rows = cursor.fetchall()         # 先要将 SQLite3 返回结果改为 List,默认是元组         rows =         # 获取返回数据的字段名         cols = for description in cursor.description]         conn.close()           # 将CONTENT的结果,匹配到 sheetname或PPT的页码数         # 并且将结果覆盖掉 CONTENT的原始数据         # 先要将 SQLite3 返回结果改为 List,默认是元组         chars1 = re.findall('(?<=CONTENT LIKE \'%).*(?=\')', query)         chars1 = chars1.strip('%')         chars1 = chars1.replace('%', '.*')         if chars1 == '': chars1 = '字符为空'         print(chars1)         for i2, descr in enumerate(cursor.description):             #print(descr)             if descr.upper() == 'CONTENT': content_i = i2             if descr.upper() == 'TP': TP_i = i2           print(content_i, TP_i)         for i1, row in enumerate(rows):             #print(rows)             if row == 'XLSX':                 final = rows.replace('SN:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'SN:')             if row == 'PPTX':                 final = rows.replace('PG:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'PG:')             if row == 'MSG':                 rows = 'NA'             global start_r         start_r = 0         self.show_result(cols, rows)       def open_F(self, event):         print('ok')         bg = event.widget.cget('bg')         file = event.widget.cget('text').replace('\\\\','\\')         if bg == 'white':            os.startfile(file)       def show_result(self, cols, rows):         result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry('1400x500+200+200')         start_r = 0         #result_window.attributes('-topmost', True)           # 局部函数, 销毁所有的 Label, 重写下一批, 背景色为 gold的标题行不销毁 ##########################         def dest(rows, fx):             global start_r             children = result_window.winfo_children()             start_r += fx*p_row             rows_all = len(rows)             if start_r >= rows_all: start_r = 0             if start_r < 0: start_r = int(rows_all/p_row-0.01)*p_row             LB = '返回数:'+ str(start_r) + ' / ' + str((len(rows)))             for ch in children:                 if isinstance(ch, Label) and ch.cget('bg') != 'gold':                    ch.destroy()             write_some(rows, fx)           # 局部函数, 每次写固定行数的返回结果, 到尾巴了从头开始 ##########################         def write_some(rows, fx):             global start_r             rows_all = len(rows)             for j, row in enumerate(rows[start_r:start_r+p_row if start_r+p_row                 for i, cell in enumerate(row):                     lb = Label(result_window, text=cell, anchor=W, relief=RIDGE,                                          width=text_wd, height=2, wraplength=text_wd*7)                     lb.grid(row=j+2, column=i)                     if i == 4:                        lb.config(bg='white', fg='blue')             # 绑定事件, 判断是否可以打开文件             lb.bind_class('Label', '', self.open_F)             # 确认字符数量,以便设置Label宽度,字符最多为50个,<50则取所有行的最大值         text_wd=         for j, row in enumerate(rows):             for i, cell in enumerate(row):                 if len(str(cell).strip()) > text_wd:                    text_wd = len(str(cell).strip()) if len(str(cell).strip()) < 70 else 70         print(text_wd)           # 显示标题行,行高2个字符,wraplength的像素值 = 字符数 * 7         for i, col in enumerate(cols):             Label(result_window, text=col, anchor=W, relief=RIDGE,                                  width=text_wd, bg='gold', height=2, wraplength=text_wd*7).grid(row=1, column=i)           # 显示结果行         write_some(rows, 1)           # 调用销毁和重写下一批的功能, btn02 是销毁退出 Toplevel         btn01 = Button(result_window, text='下一页', font=('黑体', 15), command=lambda:dest(rows, 1))         btn01.grid(row=0, column=1)         btn03 = Button(result_window, text='上', font=('黑体', 15), command=lambda:dest(rows, -1))         btn03.grid(row=0, column=0)         btn02 = Button(result_window, text='退出关闭', font=('黑体', 15), command=lambda:result_window.destroy())         btn02.grid(row=0, column=2, padx=2)         LB = Label(result_window, text='返回数:'+str(len(rows)), bg='gold', font=('黑体', 15))         LB.grid(row=0, column=4, sticky=W )       def mail_write(self):         # 初始全局变量,定义数据库 ##########################################################         outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")         cnt = 0         cnt_ok=0         rep0 = 0         chk_Dir = r"H:\MAIL"         all_path = chk_Dir         file_cnt=0         global v           #检查文件夹是否存在,否则创建         if os.path.exists(chk_Dir) is False:             os.mkdir(chk_Dir)             os.mkdir(chk_Dir+r'\send')         else:             print('文件夹已经存在......很OK')           wd = auto.size().width         geo_str='700x500+600+200'         if wd > 2000: geo_str='900x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)           # 获取所有根级文件夹           root_folders = outlook.Folders           disk_set = set()         for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue             for file in files:                 f1 = os.path.join(root, file)                 disk_set.add(f1)               def folder_all(folder0,item0):             for f in folder0.Folders:                 if f.Folders.Count>0:                     folder_all(f,item0)                 item0.append(f.Items)           file_cnt = 0         vv = v.get()         # 遍历每一个根级文件夹及其子文件夹         for folder in root_folders:             for sub_folder in folder.Folders:                 item0=                 #if cnt_ok >2: exit()                 text.insert(END, folder.Name+'--'+sub_folder.Name+ '\n')                 text.update()                 if (folder.Name.find('.com') > -1 and sub_folder.Name in ('202203','收件箱','已发送邮件')) if vv==0 else sub_folder.Name.find('删除')==-1:                     item0.append(sub_folder.Items)                     if sub_folder.Folders.Count>0:                         folder_all(sub_folder,item0)                         print('xxxxxxxxxxxxxxxxxxxxxxxx',len(item0))                     for mm in item0:                         try: mm.Sort("",True)                         except: pass                         rep0 = 0                         #Michael.Liu@sienidm.com                         for mail in mm:                             #break                             cnt+=1                               try:                                 sender=mail.SenderName                             except:                                 continue                               save_folder_path=all_path                             if sub_folder.Name in ('202203','已发送邮件','已发送'):                                 sender=''                                 save_folder_path=all_path+r'\send' ##                            if sub_folder.Name=='收件箱': ##                                save_folder_path=all_path                               #sender=''                             # 获取邮件主题,以此做文件名,故需要去除文件名的非法字符                             mail_subject = re.sub(r'','_',mail.Subject.replace(' ',''))                             # 获取邮件创建时间                             mail_date = mail.CreationTime.strftime("%Y-%m-%d %H-%M-%S")                             # 转换为时间戳整数                             date2=time.mktime(mail.CreationTime.timetuple())                               # 构造保存文件路径                             save_file_path = os.path.join(save_folder_path,                                                     f'{sender}_{mail_subject}={mail_date}.msg')                             file = f'{sender}_{mail_subject}={mail_date}.msg'                             f1 = save_file_path                             #print(dir(mail))                             if save_file_path in disk_set:                                 if cnt%10 == 0:                                     text.insert(END, sub_folder.Name+'.....'+str(cnt)+'......Existsed........'+'\n')                                     text.see(END)                                     text.update()                                 rep0 += 1 ##                                if rep0 > 20:break                                 continue                                 #print(sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path)                             text.insert(END, sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path+'\n')                             text.see(END)                             text.update()                             # 将邮件保存到指定路径                             try:                                 mail.SaveAs(save_file_path)                                 os.utime(save_file_path,(date2,date2))                                 cnt_ok+=1                             except:                                 print(Exception)             #print(str(cnt_ok)+'   封邮件已保存')             text.insert(END, str(cnt_ok)+'   封邮件已保存, end......'+'\n')             text.see(END)             text.update()           self.extra(text)       def extra(self, text):         file_cnt=0         CNT0 = 0         file_size = 0           chk_Dir=r"H:\MAIL"         start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))         outlook = win32com.client.Dispatch("Outlook.Application")           file_no=           time.sleep(0.2)         text.insert(END, '\n\n\n\n开始写数据库................................\n\n'+'\n')         text.see(END)         text.update()             #if DB_FILE + chk_Dir not in ('D:\FILE_03.DBH:\MAIL', 'D:\FILE_MFG.DBS:\02_MFG'): exit()             ##def extract_text_from_msg(filepath):         ##    with open(filepath, 'rb') as f:         ##        msg = Message(f)         ##        msg_sender = msg.sender         ##        msg_subject = msg.subject         ##        msg_txt = ""         ##        for chunk in msg.body:         ##            if isinstance(chunk, bytes):         ##                msg_txt += chunk.decode('gb18030', errors='ignore')         ##            else:         ##                msg_txt += str(chunk)         ##        return msg_sender, msg_subject, msg_txt           # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')             # 读取数据库中的 MSG 文件,生产集合,以便判断,如果已经存在就不上传了         c.execute("SELECT PATH FROM FILES WHERE 1=1 ")         results = c.fetchall()         hist_set = set( for result in results])         disk_set = set()           for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue             for file in files:                 f1 = os.path.join(root, file)                 disk_set.add(f1)         diff_set=disk_set-hist_set           for f1 in diff_set:             file = os.path.basename(f1)             file_size += os.path.getsize(f1)             #f1 = f1.replace('\\._','\\')             ext = os.path.splitext(file)             ext = ext.upper()             CNT0 += 1                 # 解析   MSG  文件内容######################################################             content=''             if file.find('~$') == -1 and ext == '.MSG' and (0 if f1 in hist_set else 1):                 DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                 tm1=time.time()                 tp='MSG'                 file_cnt+=1                 #print(str(file_cnt)+"...发现修改文件:", f1)                 text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                 text.see(END)                 text.update()             # 解析 MSG 文件内容                 try:                     msg = outlook.CreateItemFromTemplate(f1)                     content = msg.Body                     if content == '': content = '正文是空'                 except:                     err=traceback.format_exc()                     print(Exception)                     file_no.append(f1+'\n'+err+'\n')                     pass                 if content == '': continue                 # 插入记录到数据库                 #print(content.replace('\n\r', ''))                 tm2=time.time()                 tm3=str(round(tm2-tm1,3))                 size=len(content)                 c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                             (DT_TM,tp,file, f1,tm3,size, content))                 conn.commit()                 #print('ok......')             end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           c.close()         conn.close()         #print('end.....................................')         #print('硬盘邮件总大小......' + str(int(file_size/1000/1000)), 'M')         text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, f'end........上传了....{file_cnt}  封邮件.........'+'\n')         text.insert(END, '硬盘邮件总大小......' + str(int(file_size/1000/1000))+ 'M'+'\n')         text.see(END)         text.update()       def disk_check(self):         tm00 = time.time()         file_cnt = 0         file_all = 0             start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           file_no=           wd = auto.size().width         geo_str='700x500+600+200'         if wd > 2000: geo_str='900x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)             # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')           c.execute('SELECT PATH FROM FILES')         results = c.fetchall()         file_hist = set(list(r for r in results))         file_new = set()               for root, dirs, files in os.walk(disk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                   #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 #print(f1,ext)                     # 解析   XLSX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.XLSX':                     size=int(os.path.getsize(f1)/1000/1000)                     #ipdb.set_trace()                     if size > 3:                         #file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                         text.insert(END, f1+'\n文件过大 '+str(size)+' M,跳过......\n'+'\n')                         text.see(END)                         text.update()                         continue                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                       DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='XLSX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                     # 解析xlxs文件内容                         # 打开Excel文件                     try:                         workbook = openpyxl.load_workbook(r'{}'.format(f1))                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             workbook = openpyxl.load_workbook(r'{}'.format(f1))                             file_new.add(f1)                         except:                             #print(Exception)                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                         # 获取所有非空白的工作表名                     try:                         sheet_names = .max_column > 0 and workbook.max_row > 0]                     except:                         text.insert(END, str(Exception)+'\n')                         text.see(END)                         text.update()                         err=traceback.format_exc()                         file_no.append(f1+'\n'+err+'\n')                         continue                       # 遍历每个工作表                     for sheet_name in sheet_names:                         # 获取工作表对象                         sheet = workbook                         # 获取最大行数和列数                         max_row = sheet.max_row                         max_column = sheet.max_column                         # 只取前100行的内容                         if max_row > 30:                             max_row = 30                         if max_column > 20:                             max_column = 20                           # 遍历每行和每列,获取单元格内容                         # 每个sheet把表名加在前面 SN:sheetname:                         content = content + ' SN:{}:'.format(sheet_name)                         for row in range(1, max_row+1):                             for column in range(1, max_column+1):                                 # 获取单元格内容                                 value=sheet.cell(row=row, column=column).value                                 if value is None:                                     continue                                 if str(value).find('=')>-1:                                     continue                                 if str(value).isnumeric():                                     continue                                 content = content + ',' + str(value)                       # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                   # 解析   PPTX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.PPTX':                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='PPTX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析pptx文件内容                     try:                         prs = Presentation(f1)                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             prs = Presentation(f1)                             file_new.add(f1)                         except:                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                       for pg, slide in enumerate(prs.slides):                         content += '\nPG:{}:'.format(str(pg))                         content += ','.join(paragraph.text for shape in slide.shapes if shape.has_text_frame                                         for paragraph in shape.text_frame.paragraphs)                         # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))             conn.close()           text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, str(time.time()-tm00)+'\n')         text.insert(END, f'共完成 ...{file_cnt}...个文件,存到数据库,请关闭此窗口'+'\n')         text.see(END)         text.update()         if __name__ == '__main__':     user = os.getlogin()     if user not in ['刘晓勇','Q01077','李艳','Q01178','Doris','Q01177','成航','Q02149','Lita','Q03745',                     '文豪','Q01772','天慧','Q00931','李庆','Q03938','光瑜','Q00564','倩茹','Q03959','詹恒','Q01034',                     '雪武','Q01036','徐彤','Q00295','王雪','Q02101','亚伟','Q03558','大英','Q03723','许海玲','Q00218',                     '吴诤','Q03909','孟令成','Q00836','陈晋','Q02284','宽结','Q03633','修远','Q00017','Jacky','Q00754',                     '满仓','Q03244','何其浩','Q01169','阿彪','Q01069','新俊','Q03520','孟凡勇','Q01695',                     '李敏','Q00988','张幸娥','Q00260','朱玮','Q04124','于宏斌','Q03469','王介伟','Q00122',                     '刘媛','Q02110','周琴','Q01986','王欣','Q00034','胡凯','Q00642']:         auto.confirm('您还没有授权测试,请联系他!!!')         sys.exit()     wd = auto.size().width     geo_str='650x500+600+200'     if wd > 2000: geo_str='850x600+600+200'       root = Tk()     root.title('文件_邮件管理_查询界面')     root.geometry(geo_str)     app = Application(master=root)     root.mainloop()  
文件和邮件02
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 代码可以实现对 SQLite3的数据库查询,可更改数据库名,可修改查询 # 返回结果,如果是文件路径,可以单击打开 import sys, os, re, datetime, time, traceback import win32timezone sys.path.append(r"xxx") from tkinter import * import sqlite3 import pyautogui as auto import ctypes.wintypes import win32com.client from pptx import Presentation import openpyxl import base64 from PIL import Image, ImageTk from io import BytesIO     start_r = 0                 # 起始行 p_row=8                     # 每页显示的行数 DB_FILE = r'E:\FILE_00X.DB' # 默认的数据库文件 disk_Dir=r"E:\\"       class Application(Frame):     '''查询数据库 SQLite3, 并且打开文件'''     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack()         self.newWidget()     # 设计查询主界面     def newWidget(self):         Button(self, text="数据库文件:", font=('黑体', 12)).grid(row=0,column=0, sticky=W )         self.text_db=Text(self, width=40, height=1, bg='lightgray', font=('黑体', 16))         self.text_db.grid(row=1, column=0)         self.text_db.insert(1.0,DB_FILE)           Button(self, text="SQL代码区:", font=('黑体', 12)).grid(row=2,column=0, sticky=W)         self.text_in=Text(self, width=40, height=10, bg='wheat', font=('黑体', 16))         self.text_in.insert(END,     """SELECT ID,FILENAME,DT,TP,PATH,TM     FROM FILES     WHERE 1=1     AND FILENAME LIKE '%%%'     AND TP LIKE '%%%'     AND PATH LIKE '%%%'     AND CONTENT LIKE '%%%%%'      ORDER BY DT DESC     """)         base64_string = b'iVBORw0KGgoAAAAORK5CYII='         decoded_image_data = base64.b64decode(base64_string)         sien = ImageTk.PhotoImage(Image.open(BytesIO(decoded_image_data)))           self.text_in.grid(row=3, rowspan=6, column=0)         # 邮件保存 ##########################################################         self.btn01=Button(self, text="邮件保存", font=('黑体', 16), command=self.mail_write)         self.btn01.grid(row=3, column=1, sticky=N )           self.btn02=Button(self, text="查询", font=('黑体', 20), bg='#00aff0', command=self.query)         self.btn02.grid(row=0, column=1, sticky=W )         # 本地文件 ##########################################################         self.btn03=Button(self, text="文件更新", font=('黑体', 16), command=self.disk_check)         self.btn03.grid(row=4, column=1, rowspan=2, sticky=N )           self.label03=Label(self, text="腹有诗书气自华,云鹤孤鸷任天涯...", font=('黑体', 12))         self.label03.grid(row=10, column=0,  sticky=E )         bt2=Label(self,image=sien)         bt2.image=sien         bt2.grid(row=10, column=1,  sticky='e')       def query(self):         query = self.text_in.get(1.0, END).replace('FROM', ',CONTENT FROM')         print(query)         DB = self.text_db.get(1.0, END)         print(DB)         # 从Text组件获取的文本含有特殊字符,记得用 strip()去除掉         conn = sqlite3.connect(DB.strip())         cursor = conn.cursor()         cursor.execute(query)         rows = cursor.fetchall()         # 先要将 SQLite3 返回结果改为 List,默认是元组         rows =         # 获取返回数据的字段名         cols = for description in cursor.description]         conn.close()           # 将CONTENT的结果,匹配到 sheetname或PPT的页码数         # 并且将结果覆盖掉 CONTENT的原始数据         # 先要将 SQLite3 返回结果改为 List,默认是元组         chars1 = re.findall('(?<=CONTENT LIKE \'%).*(?=\')', query)         chars1 = chars1.strip('%')         chars1 = chars1.replace('%', '.*')         if chars1 == '': chars1 = '字符为空'         print(chars1)         for i2, descr in enumerate(cursor.description):             #print(descr)             if descr.upper() == 'CONTENT': content_i = i2             if descr.upper() == 'TP': TP_i = i2           print(content_i, TP_i)         for i1, row in enumerate(rows):             #print(rows)             if row == 'XLSX':                 final = rows.replace('SN:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'SN:')             if row == 'PPTX':                 final = rows.replace('PG:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'PG:')             if row == 'MSG':                 rows = 'NA'             global start_r         start_r = 0         self.show_result(cols, rows)       def open_F(self, event):         print('ok')         bg = event.widget.cget('bg')         file = event.widget.cget('text').replace('\\\\','\\')         if bg == 'white':            os.startfile(file)       def show_result(self, cols, rows):         result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry('1400x500+200+200')         start_r = 0         #result_window.attributes('-topmost', True)           # 局部函数, 销毁所有的 Label, 重写下一批, 背景色为 gold的标题行不销毁 ##########################         def dest(rows, fx):             global start_r             children = result_window.winfo_children()             start_r += fx*p_row             rows_all = len(rows)             if start_r >= rows_all: start_r = 0             if start_r < 0: start_r = int(rows_all/p_row-0.01)*p_row             LB = '返回数:'+ str(start_r) + ' / ' + str((len(rows)))             for ch in children:                 if isinstance(ch, Label) and ch.cget('bg') != 'gold':                    ch.destroy()             write_some(rows, fx)           # 局部函数, 每次写固定行数的返回结果, 到尾巴了从头开始 ##########################         def write_some(rows, fx):             global start_r             rows_all = len(rows)             for j, row in enumerate(rows):                 for i, cell in enumerate(row):                     lb = Label(result_window, text=cell, anchor=W, relief=RIDGE,                                          width=text_wd, height=2, wraplength=text_wd*7)                     lb.grid(row=j+2, column=i)                     if i == 4:                        lb.config(bg='white', fg='blue')             # 绑定事件, 判断是否可以打开文件             lb.bind_class('Label', '<Button-1>', self.open_F)             # 确认字符数量,以便设置Label宽度,字符最多为50个,<50则取所有行的最大值         text_wd=         for j, row in enumerate(rows):             for i, cell in enumerate(row):                 if len(str(cell).strip()) > text_wd:                    text_wd = len(str(cell).strip()) if len(str(cell).strip()) < 70 else 70         print(text_wd)           # 显示标题行,行高2个字符,wraplength的像素值 = 字符数 * 7         for i, col in enumerate(cols):             Label(result_window, text=col, anchor=W, relief=RIDGE,                                  width=text_wd, bg='gold', height=2, wraplength=text_wd*7).grid(row=1, column=i)           # 显示结果行         write_some(rows, 1)           # 调用销毁和重写下一批的功能, btn02 是销毁退出 Toplevel         btn01 = Button(result_window, text='下一页', font=('黑体', 15), command=lambda:dest(rows, 1))         btn01.grid(row=0, column=1)         btn03 = Button(result_window, text='上', font=('黑体', 15), command=lambda:dest(rows, -1))         btn03.grid(row=0, column=0)         btn02 = Button(result_window, text='退出关闭', font=('黑体', 15), command=lambda:result_window.destroy())         btn02.grid(row=0, column=2, padx=2)         LB = Label(result_window, text='返回数:'+str(len(rows)), bg='gold', font=('黑体', 15))         LB.grid(row=0, column=4, sticky=W )       def mail_write(self):         # 初始全局变量,定义数据库 ##########################################################         outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")         cnt = 0         cnt_ok=0         rep0 = 0         chk_Dir = r"H:\MAIL"         all_path = chk_Dir         file_cnt=0           #检查文件夹是否存在,否则创建         if os.path.exists(chk_Dir) is False:             os.mkdir(chk_Dir)             os.mkdir(chk_Dir+r'\send')         else:             print('文件夹已经存在......很OK')           wd = auto.size().width         geo_str='600x500+600+200'         if wd > 2000: geo_str='800x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)           # 获取所有根级文件夹           root_folders = outlook.Folders               def folder_all(folder0,item0):             for f in folder0.Folders:                 if f.Folders.Count>0:                     folder_all(f,item0)                 item0.append(f.Items)           file_cnt = 0         # 遍历每一个根级文件夹及其子文件夹         for folder in root_folders:             for sub_folder in folder.Folders:                 item0=                 #if cnt_ok >2: exit()                 text.insert(END, folder.Name+'--'+sub_folder.Name+ '\n')                 text.update()                 if folder.Name.find('.com') > -1 and  sub_folder.Name in ('202203','收件箱','已发送邮件'):                     item0.append(sub_folder.Items)                     if sub_folder.Folders.Count>0:                         folder_all(sub_folder,item0)                         print('xxxxxxxxxxxxxxxxxxxxxxxx',len(item0))                     for mm in item0:                         #Michael.Liu@sienidm.com                         for mail in mm:                             #break                             cnt+=1                             try:                                 sender=mail.SenderName                             except:                                 continue                             if sub_folder.Name in ('202203','已发送邮件'):                                 sender=''                                 save_folder_path=all_path+r'\send'                             if sub_folder.Name=='收件箱':                                 save_folder_path=all_path                               #sender=''                             # 获取邮件主题,以此做文件名,故需要去除文件名的非法字符                             mail_subject = re.sub(r'','_',mail.Subject.replace(' ',''))                             # 获取邮件创建时间                             mail_date = mail.CreationTime.strftime("%Y-%m-%d %H-%M-%S")                             # 转换为时间戳整数                             date2=time.mktime(mail.CreationTime.timetuple())                               # 构造保存文件路径                             save_file_path = os.path.join(save_folder_path,                                                     f'{sender}_{mail_subject}={mail_date}.msg')                             file = f'{sender}_{mail_subject}={mail_date}.msg'                             f1 = save_file_path                             #print(dir(mail))                             if os.path.exists(save_file_path):                                 if cnt%10 == 0:                                     text.insert(END, sub_folder.Name+'.....'+str(cnt)+'......Existsed........'+'\n')                                     text.see(END)                                     text.update()                                 rep0 += 1                                 #if rep0>3:break                                 continue                             #print(sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path)                             text.insert(END, sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path+'\n')                             text.see(END)                             text.update()                             # 将邮件保存到指定路径                             try:                                 mail.SaveAs(save_file_path)                                 os.utime(save_file_path,(date2,date2))                                 cnt_ok+=1                             except:                                 print(Exception)             #print(str(cnt_ok)+'   封邮件已保存')             text.insert(END, str(cnt_ok)+'   封邮件已保存, end......'+'\n')             text.see(END)             text.update()           self.extra(text)       def extra(self, text):         file_cnt=0         CNT0 = 0         file_size = 0           chk_Dir=r"H:\MAIL"         start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))         outlook = win32com.client.Dispatch("Outlook.Application")           file_no=           time.sleep(0.2)         text.insert(END, '开始写数据库................................'+'\n')         text.see(END)         text.update()             #if DB_FILE + chk_Dir not in ('D:\FILE_03.DBH:\MAIL', 'D:\FILE_MFG.DBS:\02_MFG'): exit()             ##def extract_text_from_msg(filepath):         ##    with open(filepath, 'rb') as f:         ##        msg = Message(f)         ##        msg_sender = msg.sender         ##        msg_subject = msg.subject         ##        msg_txt = ""         ##        for chunk in msg.body:         ##            if isinstance(chunk, bytes):         ##                msg_txt += chunk.decode('gb18030', errors='ignore')         ##            else:         ##                msg_txt += str(chunk)         ##        return msg_sender, msg_subject, msg_txt           # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')             # 读取数据库中的 MSG 文件,生产集合,以便判断,如果已经存在就不上传了         c.execute("SELECT PATH FROM FILES WHERE 1=1 ")         results = c.fetchall()         hist_set = set( for result in results])           for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                 file_size += os.path.getsize(f1)                 #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 CNT0 += 1                     # 解析   MSG  文件内容######################################################                 content=''                 if f1 in hist_set:                     #print(str(CNT0)+'Exist.....................')                     if CNT0 % 10 ==0:                         text.insert(END, str(CNT0)+'Exist.....................'+'\n')                         text.see(END)                         text.update()                     continue                 if file.find('~$') == -1 and ext == '.MSG' and (0 if f1 in hist_set else 1):                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='MSG'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析 MSG 文件内容                     try:                         msg = outlook.CreateItemFromTemplate(f1)                         content = msg.Body                         if content == '': content = '正文是空'                     except:                         err=traceback.format_exc()                         print(Exception)                         file_no.append(f1+'\n'+err+'\n')                         pass                     if content == '': continue                     # 插入记录到数据库                     #print(content.replace('\n\r', ''))                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                     #print('ok......')           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           c.close()         conn.close()         #print('end.....................................')         #print('硬盘邮件总大小......' + str(int(file_size/1000/1000)), 'M')         text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, f'end........上传了....{file_cnt}  封邮件.........'+'\n')         text.insert(END, '硬盘邮件总大小......' + str(int(file_size/1000/1000))+ 'M'+'\n')         text.see(END)         text.update()       def disk_check(self):         tm00 = time.time()         file_cnt = 0         file_all = 0             start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           file_no=           wd = auto.size().width         geo_str='600x500+600+200'         if wd > 2000: geo_str='800x650+600+200'         result_window = Toplevel()         result_window.title('运行中......看到结果提示后,请关闭此窗口...')         result_window.geometry(geo_str)         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)             # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')           c.execute('SELECT PATH FROM FILES')         results = c.fetchall()         file_hist = set(list(r for r in results))         file_new = set()               for root, dirs, files in os.walk(disk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                   #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 #print(f1,ext)                     # 解析   XLSX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.XLSX':                     size=int(os.path.getsize(f1)/1000/1000)                     #ipdb.set_trace()                     if size > 3:                         #file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                         text.insert(END, f1+'\n文件过大 '+str(size)+' M,跳过......\n'+'\n')                         text.see(END)                         text.update()                         continue                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                       DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='XLSX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                     # 解析xlxs文件内容                         # 打开Excel文件                     try:                         workbook = openpyxl.load_workbook(r'{}'.format(f1))                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             workbook = openpyxl.load_workbook(r'{}'.format(f1))                             file_new.add(f1)                         except:                             #print(Exception)                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                         # 获取所有非空白的工作表名                     try:                         sheet_names = .max_column > 0 and workbook.max_row > 0]                     except:                         text.insert(END, str(Exception)+'\n')                         text.see(END)                         text.update()                         err=traceback.format_exc()                         file_no.append(f1+'\n'+err+'\n')                         continue                       # 遍历每个工作表                     for sheet_name in sheet_names:                         # 获取工作表对象                         sheet = workbook                         # 获取最大行数和列数                         max_row = sheet.max_row                         max_column = sheet.max_column                         # 只取前100行的内容                         if max_row > 30:                             max_row = 30                         if max_column > 20:                             max_column = 20                           # 遍历每行和每列,获取单元格内容                         # 每个sheet把表名加在前面 SN:sheetname:                         content = content + ' SN:{}:'.format(sheet_name)                         for row in range(1, max_row+1):                             for column in range(1, max_column+1):                                 # 获取单元格内容                                 value=sheet.cell(row=row, column=column).value                                 if value is None:                                     continue                                 if str(value).find('=')>-1:                                     continue                                 if str(value).isnumeric():                                     continue                                 content = content + ',' + str(value)                       # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                   # 解析   PPTX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.PPTX':                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='PPTX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析pptx文件内容                     try:                         prs = Presentation(f1)                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             prs = Presentation(f1)                             file_new.add(f1)                         except:                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                       for pg, slide in enumerate(prs.slides):                         content += '\nPG:{}:'.format(str(pg))                         content += ','.join(paragraph.text for shape in slide.shapes if shape.has_text_frame                                         for paragraph in shape.text_frame.paragraphs)                         # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))             conn.close()           text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, str(time.time()-tm00)+'\n')         text.insert(END, f'共完成 ...{file_cnt}...个文件,存到数据库,请关闭此窗口'+'\n')         text.see(END)         text.update()         if __name__ == '__main__':     user = os.getlogin()     if user not in :         auto.confirm('您还没有授权测试,请联系他!!!')         sys.exit()     wd = auto.size().width     geo_str='550x350+600+200'     if wd > 2000: geo_str='750x450+600+200'       root = Tk()     root.title('文件_邮件管理_查询界面')     root.geometry(geo_str)     app = Application(master=root)     root.mainloop()  
文件和邮件
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 代码可以实现对 SQLite3的数据库查询,可更改数据库名,可修改查询 # 返回结果,如果是文件路径,可以单击打开 import sys, os, re, datetime, time, traceback import win32timezone sys.path.append(r"xxx") from tkinter import * import sqlite3 import pyautogui as auto import ctypes.wintypes import win32com.client from pptx import Presentation import openpyxl     start_r = 0                 # 起始行 p_row=8                     # 每页显示的行数 DB_FILE = r'H:\FILE_00X.DB' # 默认的数据库文件 disk_Dir=r"H:\\"     class Application(Frame):     '''查询数据库 SQLite3, 并且打开文件'''     def __init__(self, master=None):         super().__init__(master)         self.master = master         self.pack()         self.newWidget()     # 设计查询主界面     def newWidget(self):         Button(self, text="数据库文件:", font=('黑体', 12)).grid(row=0,column=0, sticky=W )         self.text_db=Text(self, width=40, height=1, bg='lightgray', font=('黑体', 16))         self.text_db.grid(row=1, column=0)         self.text_db.insert(1.0,DB_FILE)           Button(self, text="SQL代码区:", font=('黑体', 12)).grid(row=2,column=0, sticky=W)         self.text_in=Text(self, width=40, height=10, bg='wheat', font=('黑体', 16))         self.text_in.insert(END,     """SELECT ID,FILENAME,DT,TP,PATH,TM     FROM FILES     WHERE 1=1     AND FILENAME LIKE '%%%'     AND TP LIKE '%%%'     AND PATH LIKE '%%%'     AND CONTENT LIKE '%%%%%'      ORDER BY DT DESC     """)         self.text_in.grid(row=3, rowspan=6, column=0)         # 邮件保存 ##########################################################         self.btn01=Button(self, text="邮件保存", font=('黑体', 16), command=self.mail_write)         self.btn01.grid(row=3, column=1, sticky=N )           self.btn02=Button(self, text="查询", font=('黑体', 20), command=self.query)         self.btn02.grid(row=0, column=1, sticky=W )         # 本地文件 ##########################################################         self.btn03=Button(self, text="文件更新", font=('黑体', 16), command=self.disk_check)         self.btn03.grid(row=4, column=1, rowspan=2, sticky=N )       def query(self):         query = self.text_in.get(1.0, END).replace('FROM', ',CONTENT FROM')         print(query)         DB = self.text_db.get(1.0, END)         print(DB)         # 从Text组件获取的文本含有特殊字符,记得用 strip()去除掉         conn = sqlite3.connect(DB.strip())         cursor = conn.cursor()         cursor.execute(query)         rows = cursor.fetchall()         # 先要将 SQLite3 返回结果改为 List,默认是元组         rows =         # 获取返回数据的字段名         cols = for description in cursor.description]         conn.close()           # 将CONTENT的结果,匹配到 sheetname或PPT的页码数         # 并且将结果覆盖掉 CONTENT的原始数据         # 先要将 SQLite3 返回结果改为 List,默认是元组         chars1 = re.findall('(?<=CONTENT LIKE \'%).*(?=\')', query)         chars1 = chars1.strip('%')         chars1 = chars1.replace('%', '.*')         if chars1 == '': chars1 = '字符为空'         print(chars1)         for i2, descr in enumerate(cursor.description):             #print(descr)             if descr.upper() == 'CONTENT': content_i = i2             if descr.upper() == 'TP': TP_i = i2           print(content_i, TP_i)         for i1, row in enumerate(rows):             #print(rows)             if row == 'XLSX':                 final = rows.replace('SN:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'SN:')             if row == 'PPTX':                 final = rows.replace('PG:', 'ÿ').replace('\n', '')                 chars_result = re.findall('ÿ*:(?=*{})'.format(chars1), final, 2)                 pos_name = ', '.join(chars_result)                 #print(rows)                 rows = pos_name.replace('ÿ', 'PG:')             if row == 'MSG':                 rows = 'NA'             global start_r         start_r = 0         self.show_result(cols, rows)       def open_F(self, event):         print('ok')         bg = event.widget.cget('bg')         file = event.widget.cget('text').replace('\\\\','\\')         if bg == 'white':            os.startfile(file)       def show_result(self, cols, rows):         result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry('1400x500+200+200')         start_r = 0         #result_window.attributes('-topmost', True)           # 局部函数, 销毁所有的 Label, 重写下一批, 背景色为 gold的标题行不销毁 ##########################         def dest(rows, fx):             global start_r             children = result_window.winfo_children()             start_r += fx*p_row             rows_all = len(rows)             if start_r >= rows_all: start_r = 0             if start_r < 0: start_r = int(rows_all/p_row-0.01)*p_row             LB = '返回数:'+ str(start_r) + ' / ' + str((len(rows)))             for ch in children:                 if isinstance(ch, Label) and ch.cget('bg') != 'gold':                    ch.destroy()             write_some(rows, fx)           # 局部函数, 每次写固定行数的返回结果, 到尾巴了从头开始 ##########################         def write_some(rows, fx):             global start_r             rows_all = len(rows)             for j, row in enumerate(rows):                 for i, cell in enumerate(row):                     lb = Label(result_window, text=cell, anchor=W, relief=RIDGE,                                          width=text_wd, height=2, wraplength=text_wd*7)                     lb.grid(row=j+2, column=i)                     if i == 4:                        lb.config(bg='white', fg='blue')             # 绑定事件, 判断是否可以打开文件             lb.bind_class('Label', '<Button-1>', self.open_F)             # 确认字符数量,以便设置Label宽度,字符最多为50个,<50则取所有行的最大值         text_wd=         for j, row in enumerate(rows):             for i, cell in enumerate(row):                 if len(str(cell).strip()) > text_wd:                    text_wd = len(str(cell).strip()) if len(str(cell).strip()) < 70 else 70         print(text_wd)           # 显示标题行,行高2个字符,wraplength的像素值 = 字符数 * 7         for i, col in enumerate(cols):             Label(result_window, text=col, anchor=W, relief=RIDGE,                                  width=text_wd, bg='gold', height=2, wraplength=text_wd*7).grid(row=1, column=i)           # 显示结果行         write_some(rows, 1)           # 调用销毁和重写下一批的功能, btn02 是销毁退出 Toplevel         btn01 = Button(result_window, text='下一页', font=('黑体', 15), command=lambda:dest(rows, 1))         btn01.grid(row=0, column=1)         btn03 = Button(result_window, text='上', font=('黑体', 15), command=lambda:dest(rows, -1))         btn03.grid(row=0, column=0)         btn02 = Button(result_window, text='退出关闭', font=('黑体', 15), command=lambda:result_window.destroy())         btn02.grid(row=0, column=2, padx=2)         LB = Label(result_window, text='返回数:'+str(len(rows)), bg='gold', font=('黑体', 15))         LB.grid(row=0, column=4, sticky=W )       def mail_write(self):         # 初始全局变量,定义数据库 ##########################################################         outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")         cnt = 0         cnt_ok=0         rep0 = 0         chk_Dir = r"H:\MAIL"         all_path = chk_Dir         file_cnt=0           #检查文件夹是否存在,否则创建         if os.path.exists(chk_Dir) is False:             os.mkdir(chk_Dir)             os.mkdir(chk_Dir+r'\send')         else:             print('文件夹已经存在......很OK')           result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry('600x500+600+200')         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)           # 获取所有根级文件夹           root_folders = outlook.Folders           # 遍历每一个根级文件夹及其子文件夹         for folder in root_folders:             for sub_folder in folder.Folders:                 #if cnt_ok >2: exit()                 text.insert(END, folder.Name+'--'+sub_folder.Name+ '\n')                 text.update()                 if folder.Name.find('.com') > -1 and sub_folder.Name in ('202203','收件箱','已发送邮件'):                     #Michael.Liu@sienidm.com                     inbox2=sub_folder                     file_cnt = 0                     for mail in inbox2.Items:                         #break                         cnt+=1                         try:                             sender=mail.SenderName                         except:                             continue                         if sub_folder.Name in ('202203','已发送邮件'):                             sender=''                             save_folder_path=all_path+r'\send'                         if sub_folder.Name=='收件箱':                             save_folder_path=all_path                           #sender=''                         # 获取邮件主题,以此做文件名,故需要去除文件名的非法字符                         mail_subject = re.sub(r'','_',mail.Subject.replace(' ',''))                         # 获取邮件创建时间                         mail_date = mail.CreationTime.strftime("%Y-%m-%d %H-%M-%S")                         # 转换为时间戳整数                         date2=time.mktime(mail.CreationTime.timetuple())                           # 构造保存文件路径                         save_file_path = os.path.join(save_folder_path,                                                 f'{sender}_{mail_subject}={mail_date}.msg')                         file = f'{sender}_{mail_subject}={mail_date}.msg'                         f1 = save_file_path                         #print(dir(mail))                         if os.path.exists(save_file_path):                             text.insert(END, sub_folder.Name+'.....'+str(cnt)+'......Existsed........'+'\n')                             text.see(END)                             text.update()                             rep0 += 1                             #if rep0>3:break                             continue                         #print(sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path)                         text.insert(END, sub_folder.Name+'.....'+str(cnt)+'::'+save_file_path+'\n')                         text.see(END)                         text.update()                         # 将邮件保存到指定路径                         try:                             mail.SaveAs(save_file_path)                             os.utime(save_file_path,(date2,date2))                             cnt_ok+=1                         except:                             print(Exception)             #print(str(cnt_ok)+'   封邮件已保存')             text.insert(END, str(cnt_ok)+'   封邮件已保存, end......'+'\n')             text.see(END)             text.update()           self.extra(text)       def extra(self, text):         file_cnt=0         CNT0 = 0         file_size = 0           chk_Dir=r"H:\MAIL"         start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))         outlook = win32com.client.Dispatch("Outlook.Application")           file_no=           time.sleep(0.2)         text.insert(END, '开始写数据库................................'+'\n')         text.see(END)         text.update()             #if DB_FILE + chk_Dir not in ('D:\FILE_03.DBH:\MAIL', 'D:\FILE_MFG.DBS:\02_MFG'): exit()             ##def extract_text_from_msg(filepath):         ##    with open(filepath, 'rb') as f:         ##        msg = Message(f)         ##        msg_sender = msg.sender         ##        msg_subject = msg.subject         ##        msg_txt = ""         ##        for chunk in msg.body:         ##            if isinstance(chunk, bytes):         ##                msg_txt += chunk.decode('gb18030', errors='ignore')         ##            else:         ##                msg_txt += str(chunk)         ##        return msg_sender, msg_subject, msg_txt           # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')             # 读取数据库中的 MSG 文件,生产集合,以便判断,如果已经存在就不上传了         c.execute("SELECT PATH FROM FILES WHERE 1=1 ")         results = c.fetchall()         hist_set = set( for result in results])           for root, dirs, files in os.walk(chk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                 file_size += os.path.getsize(f1)                 #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 CNT0 += 1                     # 解析   MSG  文件内容######################################################                 content=''                 if f1 in hist_set:                     #print(str(CNT0)+'Exist.....................')                     text.insert(END, str(CNT0)+'Exist.....................'+'\n')                     text.see(END)                     text.update()                 if file.find('~$') == -1 and ext == '.MSG' and (0 if f1 in hist_set else 1):                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='MSG'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析 MSG 文件内容                     try:                         msg = outlook.CreateItemFromTemplate(f1)                         content = msg.Body                         if content == '': content = '正文是空'                     except:                         err=traceback.format_exc()                         print(Exception)                         file_no.append(f1+'\n'+err+'\n')                         pass                     if content == '': continue                     # 插入记录到数据库                     #print(content.replace('\n\r', ''))                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                     #print('ok......')           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           c.close()         conn.close()         #print('end.....................................')         #print('硬盘邮件总大小......' + str(int(file_size/1000/1000)), 'M')         text.insert(END, 'end.....................................'+'\n')         text.insert(END, '硬盘邮件总大小......' + str(int(file_size/1000/1000))+ 'M'+'\n')         text.see(END)         text.update()       def disk_check(self):         tm00 = time.time()         file_cnt = 0         file_all = 0             start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))           file_no=           result_window = Toplevel()         result_window.title('查询结果')         result_window.geometry('600x500+600+200')         frame = Frame(result_window)         frame.pack(side='left', fill='both', expand=True)         text = Text(frame, width=40, font=('黑体', 16), fg='#00fd35', bg='#434345')         text.pack(side='left', fill='both', expand=True)           scrollbar1 = Scrollbar(frame, command=text.yview)         scrollbar1.pack(side='left', fill='y')           text.config(yscrollcommand=scrollbar1.set)             # 定义数据库表结构和连接         conn = sqlite3.connect(DB_FILE,check_same_thread=False)         c = conn.cursor()         c.execute('''             CREATE TABLE IF NOT EXISTS FILES (                 id INTEGER PRIMARY KEY AUTOINCREMENT,                 filename TEXT,                 dt TEXT,                 TP TEXT,                 path TEXT,                 tm TEXT,                 SIZE INTEGER,                 content TEXT             )         ''')           c.execute('SELECT PATH FROM FILES')         results = c.fetchall()         file_hist = set(list(r for r in results))         file_new = set()               for root, dirs, files in os.walk(disk_Dir,topdown=False):             if root.upper().find("Welink_Files")>-1:                 continue               for file in files:                 f1 = os.path.join(root, file)                   #f1 = f1.replace('\\._','\\')                 ext = os.path.splitext(file)                 ext = ext.upper()                 #print(f1,ext)                     # 解析   XLSX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.XLSX':                     size=int(os.path.getsize(f1)/1000/1000)                     #ipdb.set_trace()                     if size > 3:                         #file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                         text.insert(END, f1+'\n文件过大 '+str(size)+' M,跳过......\n'+'\n')                         text.see(END)                         text.update()                         continue                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                       DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='XLSX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                     # 解析xlxs文件内容                         # 打开Excel文件                     try:                         workbook = openpyxl.load_workbook(r'{}'.format(f1))                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             workbook = openpyxl.load_workbook(r'{}'.format(f1))                             file_new.add(f1)                         except:                             #print(Exception)                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                         # 获取所有非空白的工作表名                     try:                         sheet_names = .max_column > 0 and workbook.max_row > 0]                     except:                         text.insert(END, str(Exception)+'\n')                         text.see(END)                         text.update()                         err=traceback.format_exc()                         file_no.append(f1+'\n'+err+'\n')                         continue                       # 遍历每个工作表                     for sheet_name in sheet_names:                         # 获取工作表对象                         sheet = workbook                         # 获取最大行数和列数                         max_row = sheet.max_row                         max_column = sheet.max_column                         # 只取前100行的内容                         if max_row > 30:                             max_row = 30                         if max_column > 20:                             max_column = 20                           # 遍历每行和每列,获取单元格内容                         # 每个sheet把表名加在前面 SN:sheetname:                         content = content + ' SN:{}:'.format(sheet_name)                         for row in range(1, max_row+1):                             for column in range(1, max_column+1):                                 # 获取单元格内容                                 value=sheet.cell(row=row, column=column).value                                 if value is None:                                     continue                                 if str(value).find('=')>-1:                                     continue                                 if str(value).isnumeric():                                     continue                                 content = content + ',' + str(value)                       # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()                   # 解析   PPTX  文件内容######################################################                 content=''                 if file.find('~$') == -1 and ext == '.PPTX':                     file_all += 1                     if f1 in file_hist:                         #print(root + '\nExist..........' + str(file_all))                         text.insert(END, root + '\nExist..........' + str(file_all)+'\n')                         text.see(END)                         text.update()                         file_new.add(f1)                         continue                     DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))                     tm1=time.time()                     tp='PPTX'                     file_cnt+=1                     #print(str(file_cnt)+"...发现修改文件:", f1)                     text.insert(END, str(file_cnt)+"...发现修改文件:"+f1+'\n')                     text.see(END)                     text.update()                 # 解析pptx文件内容                     try:                         prs = Presentation(f1)                         file_new.add(f1)                     except:                         time.sleep(3)                         try:                             prs = Presentation(f1)                             file_new.add(f1)                         except:                             text.insert(END, str(Exception)+'\n')                             text.see(END)                             text.update()                             err=traceback.format_exc()                             file_no.append(f1+'\n'+err+'\n')                             c.execute('INSERT INTO files (dt,tp,filename, path,tm,size, content) VALUES (? ,?,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,0,0, '打开出错'))                             conn.commit()                             continue                       for pg, slide in enumerate(prs.slides):                         content += '\nPG:{}:'.format(str(pg))                         content += ','.join(paragraph.text for shape in slide.shapes if shape.has_text_frame                                         for paragraph in shape.text_frame.paragraphs)                         # 插入记录到数据库                     #print(content)                     tm2=time.time()                     tm3=str(round(tm2-tm1,3))                     size=len(content)                     c.execute('INSERT INTO files (dt,tp,filename, path, tm,size,content) VALUES (?,? ,?,?, ?,?, ?)',                                 (DT_TM,tp,file, f1,tm3,size, content))                     conn.commit()           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))             conn.close()           text.insert(END, '\n\n\n\n\nend.....................................'+'\n')         text.insert(END, str(time.time()-tm00)+'\n')         text.insert(END, f'共完成 ...{file_cnt}...个文件,存到数据库,请关闭此窗口'+'\n')         text.see(END)         text.update()         if __name__ == '__main__':     user = os.getlogin()     if user not in :         auto.confirm('您还没有授权测试,请联系他!!!')         sys.exit()     wd = auto.size().width     geo_str='550x350+600+200'     if wd > 2000: geo_str='750x450+600+200'       root = Tk()     root.title('SQLite3数据库查询')     root.geometry(geo_str)     app = Application(master=root)     root.mainloop()  
TEST09
##本程序可以遍历本地制定目录,并且将其文本内容上传的SQLITE3的数据库 ##数据库字段包含ID,FILENAME,DT,          TP,         PATH,   TM,         SIZE,       CONTENT ##              ID,文件名,文件修改时间,文件后缀名,文件路径,花费时间,提取的字符数,文本内容 ## ##DB_FILE是数据库文件名,表名建议 FILES ##ON_DELETED函数是解决另存文件为先删除、再创建的问题 ##ON_MODIFIED、ON_CREATED是对应事件时处理文件 ## ##本代码可以支持处理PPTX、XLSX文件,如有需要可以继续增加 MSG文件 ## ##SQLITE3的 TEXT类型是没有长度限制的。       import sys, os, time, datetime, traceback, ipdb, gc sys.path.append   import sqlite3 from multiprocessing import * from pptx import Presentation import openpyxl     file_cnt=0 cnt = 0 DB_FILE = r'D:\FILE_006.DB' chk_Dir=r"H:\\" start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) file_no=     def file_handle(lock1, file_q, lock2, new_q, lock3, content_q):     pro = current_process().name     sub_cnt = 0     with lock1: f1 = file_q.get()       while f1 != 'NA' and sub_cnt < 500:         #print(f1,ext)         content = ''         file = os.path.basename(f1)         ext = os.path.splitext(file)         ext = ext.upper()           if file.find('~$') == -1 and ext == '.XLSX':             DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))             #with lock2: new_q.put(f1)             tm1=time.time()             tp='XLSX'             #file_cnt+=1             print(pro,sub_cnt, "...发现修改文件:", f1)             # 解析xlxs文件内容             # 打开Excel文件             try:                 workbook = openpyxl.load_workbook(r'{}'.format(f1))             except:                 time.sleep(3)                 try:                     workbook = openpyxl.load_workbook(r'{}'.format(f1))                 except:                     sys.stdout.flush()                     print(Exception)                     err=traceback.format_exc()                     with lock1:  f1 = file_q.get()                     continue               # 获取所有非空白的工作表名               sheet_names = [name for name in workbook.sheetnames                         if workbook.max_column > 0 and workbook.max_row > 0]             # 遍历每个工作表               for sheet_name in sheet_names:                 # 获取工作表对象                 sheet = workbook                 # 获取最大行数和列数                 max_row = sheet.max_row                 max_column = sheet.max_column                 # 只取前100行的内容                 if max_row > 30:                     max_row = 30                 if max_column > 20:                     max_column = 20                 # 遍历每行和每列,获取单元格内容                 content += ' SN:{}:'.format(sheet_name)                 for row in range(1, max_row+1):                     for column in range(1, max_column+1):                         # 获取单元格内容                         value=sheet.cell(row=row, column=column).value                         if value is None:                             continue                         if str(value).find('=')>-1:                             continue                         if str(value).isnumeric():                             continue                         content = content +  ',' + str(value)                   # 插入记录到数据库                 #print(content)                 workbook.close()                 tm2=time.time()                 tm3=str(round(tm2-tm1,3))                 with lock3: content_q.put((DT_TM,tp,file, f1,tm3, content, pro))                 #workbook.close()                 time.sleep(0.02)                 #if file_1 > '': return                 with lock1:  f1 = file_q.get()                 sub_cnt += 1               try:    workbook.close()             except: pass             time.sleep(0.02)               # 解析   PPTX  文件内容######################################################         if file.find('~$') == -1 and ext == '.PPTX':             DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))             #with lock2: new_q.put(f1)             tm1=time.time()             tp='PPTX'             sys.stdout.flush()             print(pro,sub_cnt, "...发现修改文件:", f1)         # 解析pptx文件内容             try:                 prs = Presentation(f1)             except:                 time.sleep(3)                 try:                     prs = Presentation(f1)                 except:                     print(Exception)                     err=traceback.format_exc()                     #if file_1 > '': return                     with lock1:  f1 = file_q.get()                     continue               content = '\n'.join(paragraph.text for slide in prs.slides for shape in slide.shapes if shape.has_text_frame for paragraph in shape.text_frame.paragraphs)             # 插入记录到数据库             #print(content)               tm2=time.time()             tm3=str(round(tm2-tm1,3))             with lock3: content_q.put((DT_TM,tp,file, f1,tm3, content, pro))             #prs.close()             time.sleep(0.02)             #if file_1 > '': return             with lock1: f1 = file_q.get()             sub_cnt += 1 ##                sys.stdout.flush() ##                print(current_process().name, '***************', file_q.qsize(), f1)               try:    prs.close()             except: pass             time.sleep(0.02)         return   if __name__ == '__main__':     tm00 = time.time()     temp_q =     ppp = {}     file_q, new_q, content_q = Queue(), Queue(), Queue()     lock1, lock2, lock3 = Semaphore(6), Semaphore(6), Semaphore(6)       for i in range(1,6):         exec(f"p{i} = Process(target=file_handle, args=(lock1, file_q, lock2, new_q, lock3, content_q), name='p{i}')")         exec(f"p{i}.start()")     ##    p1.start() ##    p2.start() ##    p3.start() ##    p4.start()           # 定义数据库表结构和连接     conn = sqlite3.connect(DB_FILE,check_same_thread=False)     c = conn.cursor()     c.execute('''         CREATE TABLE IF NOT EXISTS FILES (             id INTEGER PRIMARY KEY AUTOINCREMENT,             filename TEXT,             dt TEXT,             TP TEXT,             path TEXT,             tm TEXT,             SIZE INTEGER,             content TEXT,             PRO TEXT         )     ''')         c.execute('select path from files')     back = c.fetchall()     file_hist = set( list(r for r in back) )       for root, dirs, files in os.walk(chk_Dir,topdown=False):         if root.upper().find("Welink_Files")>-1:             continue         for file in files:             f1 = os.path.join(root, file)             #f1 = f1.replace('\\._','\\')             ext = os.path.splitext(file)             ext = ext.upper()               if f1 in file_hist:                print('Exist............')                continue             try:    size=int(os.path.getsize(f1)/1000/1000)             except: size = 100             if size > 3 and file.find('~$') == -1 and ext in ( '.XLSX'):                 file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                 continue              # 解析   XLSX  文件内容######################################################             if file.find('~$') == -1 and ext in ( '.XLSX', '.PPTX'):                 if len(temp_q) < 30: temp_q.append(f1)                   if len(temp_q) == 30:                     with lock1:                         for i in range(len(temp_q)):                             file_q.put(temp_q.pop())                   if content_q.qsize() > 50:                     gc.collect()                     with lock3:                         for i in range(content_q.qsize()):                             yuan = content_q.get()                             ppp] = 1 + ppp] if yuan in ppp else 0                             c.execute('INSERT INTO files (dt,tp,filename, path, tm,content, pro) VALUES (?,?,?,?,?,?,?)', yuan)                             print('*******************************')                         conn.commit()                   while file_q.qsize() > 30:                     print(ppp)                     print(len(active_children()), file_q.qsize(), len(temp_q), content_q.qsize(), '......', lock1.get_value(), lock1.get_value())                     time.sleep(1)                     if len(active_children()) < 5:                         gc.collect()                         p = Process(target=file_handle, args=(lock1, file_q, lock2, new_q, lock3, content_q))                         p.start()                         break               for i in range(len(temp_q)):         file_q.put(temp_q.pop())       for i in range(6):         file_q.put('NA')       while len(active_children()) > 0 and file_q.qsize() > 3:         time.sleep(0.2)         print(len(active_children()), content_q.qsize(), file_q.qsize(), len(temp_q))         with lock3:         for i in range(content_q.qsize()):             c.execute('INSERT INTO files (dt,tp,filename, path, tm,content, pro) VALUES (?,?,?,?,?,?,?)', content_q.get())             print('*******************************')         conn.commit()       print(file_q.qsize(), content_q.qsize(), len(temp_q))           end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))     with open(r'd:\res01.txt', 'a', encoding='utf-8') as f:         f.writelines(str(ppp)+'\n\n')         f.writelines('\n'+start_time+'\n')         f.writelines(end_time+'\n')     conn.close()     print('end.....................................')     print(time.time()-tm00)          
test008
##本程序可以遍历本地制定目录,并且将其文本内容上传的SQLITE3的数据库 ##数据库字段包含ID,FILENAME,DT,          TP,         PATH,   TM,         SIZE,       CONTENT ##              ID,文件名,文件修改时间,文件后缀名,文件路径,花费时间,提取的字符数,文本内容 ## ##DB_FILE是数据库文件名,表名建议 FILES ##ON_DELETED函数是解决另存文件为先删除、再创建的问题 ##ON_MODIFIED、ON_CREATED是对应事件时处理文件 ## ##本代码可以支持处理PPTX、XLSX文件,如有需要可以继续增加 MSG文件 ## ##SQLITE3的 TEXT类型是没有长度限制的。       import sys, os, time, datetime, traceback, ipdb     import sqlite3 from multiprocessing import * from pptx import Presentation import openpyxl     file_cnt=0 cnt = 0 DB_FILE = r'D:\FILE_007.DB' chk_Dir=r"e:\\" start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) file_no=     def file_handle(lock1,lock2,lock3,lock4,lock5,                 file_q1,file_q2,file_q3,file_q4,file_q5,                 lk1,lk2,lk3,lk4,lk5,                 content_q1,content_q2,content_q3,content_q4,content_q5):     pro = current_process().name     p_num = pro     exec(f'with lock{p_num}: f1 = file_q{p_num}.get()')     sys.stdout.flush()     print(pro, '............', f1)       while f1 != 'NA':         #print(f1,ext)         content = ''         file = os.path.basename(f1)         ext = os.path.splitext(file)         ext = ext.upper()           if file.find('~$') == -1 and ext == '.XLSX':             DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))             #with lock2: new_q.put(f1)             tm1=time.time()             tp='XLSX'             #file_cnt+=1             print(pro, "...发现修改文件:", f1)             # 解析xlxs文件内容             # 打开Excel文件             try:                 workbook = openpyxl.load_workbook(r'{}'.format(f1))             except:                 time.sleep(3)                 try:                     workbook = openpyxl.load_workbook(r'{}'.format(f1))                 except:                     sys.stdout.flush()                     print(Exception)                     err=traceback.format_exc()                     #if file_1 > '': return                     exec(f'with lock{p_num}: f1 = file_q{p_num}.get()')                     continue             # 获取所有非空白的工作表名               sheet_names = [name for name in workbook.sheetnames                         if workbook.max_column > 0 and workbook.max_row > 0]             # 遍历每个工作表               for sheet_name in sheet_names:                 # 获取工作表对象                 sheet = workbook                 # 获取最大行数和列数                 max_row = sheet.max_row                 max_column = sheet.max_column                 # 只取前100行的内容                 if max_row > 30:                     max_row = 30                 if max_column > 20:                     max_column = 20                 # 遍历每行和每列,获取单元格内容                 content += ' SN:{}:'.format(sheet_name)                 for row in range(1, max_row+1):                     for column in range(1, max_column+1):                         # 获取单元格内容                         value=sheet.cell(row=row, column=column).value                         if value is None:                             continue                         if str(value).find('=')>-1:                             continue                         if str(value).isnumeric():                             continue                         content = content +  ',' + str(value)               # 插入记录到数据库             #print(content)             workbook.close()             tm2=time.time()             tm3=str(round(tm2-tm1,3))             exec(f'with lk{p_num}: content_q{p_num}.put((DT_TM,tp,file, f1,tm3, content, pro)')             #if file_1 > '': return             exec(f'with lock{p_num}: f1 = file_q{p_num}.get()')             # 解析   PPTX  文件内容######################################################         if file.find('~$') == -1 and ext == '.PPTX':             DT_TM= time.strftime("%Y-%m-%d_%H:%M:%S",time.localtime(os.path.getmtime(f1)))             #with lock2: new_q.put(f1)             tm1=time.time()             tp='PPTX'             sys.stdout.flush()             print(pro, "...发现修改文件:", f1)         # 解析pptx文件内容             try:                 prs = Presentation(f1)             except:                 time.sleep(3)                 try:                     prs = Presentation(f1)                 except:                     print(Exception)                     err=traceback.format_exc()                     #if file_1 > '': return                     exec(f'with lock{p_num}: f1 = file_q{p_num}.get()')                     continue             content = '\n'.join(paragraph.text for slide in prs.slides for shape in slide.shapes if shape.has_text_frame for paragraph in shape.text_frame.paragraphs)             # 插入记录到数据库             #print(content)               tm2=time.time()             tm3=str(round(tm2-tm1,3))             exec(f'with lk{p_num}: content_q{p_num}.put((DT_TM,tp,file, f1,tm3, content, pro)')             #if file_1 > '': return             exec(f'with lock{p_num}: f1 = file_q{p_num}.get()')       return   if __name__ == '__main__':     tm00 = time.time()     temp_q =       for i in range(1,6):         exec(f'file_q{i} = Queue()')         exec(f'lock{i} = Semaphore(7)')         exec(f'content_q{i} = Queue()')         exec(f'lk{i} = Semaphore(7)')         exec(f'file_q{i} = Queue()')     for i in range(1,2):         exec(f'p{i} = Process(target=file_handle, \             args=(lock1,lock2,lock3,lock4,lock5, \             file_q1,file_q2,file_q3,file_q4,file_q5, \             lk1,lk2,lk3,lk4,lk5,content_q1, \             content_q2,content_q3,content_q4,content_q5))')         exec(f'p{i}.start()')         # 定义数据库表结构和连接     conn = sqlite3.connect(DB_FILE,check_same_thread=False)     c = conn.cursor()     c.execute('''         CREATE TABLE IF NOT EXISTS FILES (             id INTEGER PRIMARY KEY AUTOINCREMENT,             filename TEXT,             dt TEXT,             TP TEXT,             path TEXT,             tm TEXT,             SIZE INTEGER,             content TEXT,             PRO TEXT         )     ''')         c.execute('select path from files')     back = c.fetchall()     file_hist = set( list(r for r in back) )       for root, dirs, files in os.walk(chk_Dir,topdown=False):         if root.upper().find("Welink_Files")>-1:             continue         for file in files:             f1 = os.path.join(root, file)             #f1 = f1.replace('\\._','\\')             ext = os.path.splitext(file)             ext = ext.upper()               if f1 in file_hist:                print('Exist............')                continue             try:    size=int(os.path.getsize(f1)/1000/1000)             except: size = 100             if size > 3 and file.find('~$') == -1 and ext in ( '.XLSX'):                 file_no.append(f1+'\n文件过大 '+str(size)+' M,跳过......\n')                 continue              # 判断文件类型,总流程等 ######################################################             if file.find('~$') == -1 and ext in ( '.XLSX', '.PPTX'):                 # 将中转列表写满 10 个 #####################################################                 if len(temp_q) < 100: temp_q.append(f1)                   if len(temp_q) == 100:                     for n in range(1,6):                         exec(f'kkk = lock{n}')                         with kkk:                             for i in range(20):                                 exec(f'file_q{n}.put(temp_q.pop())')                   while file_q1.qsize() > 10:                     time.sleep(1)                     print(len(active_children()), file_q1.qsize(), len(temp_q), content_q1.qsize(), active_children())     ##                if content_q.qsize() > 15: ##                    with lock3: ##                        for i in range(content_q.qsize()): ##                            c.execute('INSERT INTO files (dt,tp,filename, path, tm,content, pro) VALUES (?,?,?,?,?,?,?)', content_q.get()) ##                            print('*******************************') ##                        conn.commit()       print(file_q1.qsize(), len(temp_q), content_q1.qsize())       with lock1:         for i in range(len(temp_q)):             file_q1.put(temp_q.get())       for i in range(10):         file_q1.put('NA')       while len(active_children()) > 0 and file_q1.qsize() > 3:         time.sleep(0.2)         print(len(active_children()), content_q1.qsize(), file_q1.qsize())     ##    with lock3: ##        for i in range(content_q.qsize()): ##            c.execute('INSERT INTO files (dt,tp,filename, path, tm,content, pro) VALUES (?,?,?,?,?,?,?)', content_q.get()) ##            print('*******************************') ##        conn.commit()       print(file_q.qsize(), temp_q.qsize(), content_q.qsize())     ##    while content_q.empty() is False: ##        for i in range(content_q.qsize()): ##                            c.execute('INSERT INTO files (dt,tp,filename, path, tm,content) VALUES (? ,?,?, ?,?, ?)', content_q.get()) ##                            conn.commit()     ##    end_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) ##    with open(r'd:\res01.txt', 'a', encoding='utf-8') as f: ##        f.writelines(file_no) ##        f.writelines('\n'+start_time+'\n') ##        f.writelines(end_time+'\n')     conn.close() ##    print(file_hist - file_now)     print('end.....................................')     print(time.time()-tm00)          
几个例子
##本程序可以遍历本地制定目录,并且将其文本内容上传的SQLITE3的数据库 ##数据库字段包含ID,FILENAME,DT,          TP,         PATH,   TM,         SIZE,       CONTENT ##              ID,文件名,文件修改时间,文件后缀名,文件路径,花费时间,提取的字符数,文本内容 ## ##DB_FILE是数据库文件名,表名建议 FILES ##ON_DELETED函数是解决另存文件为先删除、再创建的问题 ##ON_MODIFIED、ON_CREATED是对应事件时处理文件 ## ##本代码可以支持处理PPTX、XLSX文件,如有需要可以继续增加 MSG文件 ## ##SQLITE3的 TEXT类型是没有长度限制的。  
界面修改
#!/usr/bin/env python # -*- coding: UTF-8 -*- # 代码可以实现对 SQLite3的数据库查询,可更改数据库名,可修改查询 # 返回结果,如果是文件路径,可以单击打开 import os, re from tkinter import * import sqlite3      
提取3种格式的文件
##本程序可以遍历本地制定目录,并且将其文本内容上传的SQLITE3的数据库 ##数据库字段包含ID,FILENAME,DT,          TP,         PATH,   TM,         SIZE,       CONTENT ##              ID,文件名,文件修改时间,文件后缀名,文件路径,花费时间,提取的字符数,文本内容 ## ##DB_FILE是数据库文件名,表名建议 FILES ##ON_DELETED函数是解决另存文件为先删除、再创建的问题 ##ON_MODIFIED、ON_CREATED是对应事件时处理文件 ##    
健康文件
##本程序可以监控本地制定目录的文件创建、修改,并且将其文本内容上传的SQLITE3的数据库 ##数据库字段包含ID,FILENAME,DT,          TP,         PATH,   TM,         SIZE,       CONTENT ##              ID,文件名,文件修改时间,文件后缀名,文件路径,花费时间,提取的字符数,文本内容 ## ##DB_FILE是数据库文件名,表名建议 FILES ##ON_DELETED函数是解决另存文件为先删除、再创建的问题 ##ON_MODIFIED、ON_CREATED是对应事件时处理文件 ## ##本代码可以支持处理PPTX、XLSX文件,如有需要可以继续增加 MSG文件 ## ##SQLITE3的 TEXT类型是没有长度限制的。    
保存邮件
# -*- incoding: UTF8 -*- import sys sys.path.append(r"\\XX\XX\XX\PAK")       import win32com.client import os,time,re,datetime        
文件规范检查
# -*- coding: UTF-8 -*- import os,sys   from time import localtime,strftime,time import getpass import sqlite3 import re import shutil #sys.path.append(r"h:\Pypak") sys.path.append(r"pak路径")   import openpyxl from openpyxl.worksheet.header_footer import _HeaderFooterPart from openpyxl.styles import Font       ##os.rename(r'H:\0830p\fff',r'H:\0830p\ddd') def folder_ren():     file0=0     cnt=0     cnt_all=0     cnt_no1=0     fail_no=0     folders=     ############           ----------------------------------------->>>>>>>>>>>>>>>     for root, dirs, files in os.walk(r"检查路径",topdown=False):         if root.upper().find("PYPAK")>=0:             continue         print(root)         print(cnt_all,cnt,fail_no)         bianhao=         cnt_all+=1         for dd in dirs:             if re.match(r'\d{2,3}',dd)!=None:                 bh=re.match(r'\d{2,3}',dd).group()                 if bh in bianhao:                     dd2=re.sub(r'\d{2,3}','',dd)                     try:                         os.rename(os.path.join(root,dd),os.path.join(root,dd2))                     except Exception:                         print('Fail to ............. ' + os.path.join(root,dd))                       dirs.append(dd2)                 else:                     bianhao.append(re.match(r'\d{2,3}',dd).group())           for dd in dirs:             if re.match(r'\d{2,3}',dd)!=None:                 ddnew=re.sub(r'(?<=\d{2}) ','_', dd)                 try:                     os.rename(os.path.join(root,dd),os.path.join(root,ddnew))                     print('ok.... '+os.path.join(root,dd))                     cnt+=1                 except Exception:                     print('Fail to ............. ' + os.path.join(root,dd))                     fail_no+=1                     folders.append(os.path.join(root,dd))                 if re.match(r'\d{2,3}',dd)==None:                 for nn in range(1,99):                     if format(nn,'02d') not in bianhao:                         break                   try:                     os.rename(os.path.join(root,dd),os.path.join(root,str(format(nn,'02d'))+'_'+dd))                     bianhao.append(format(nn,'02d'))                     print('ok.... '+os.path.join(root,dd))                     cnt+=1                 except Exception:                     print('Fail to ............. ' + os.path.join(root,dd))                     fail_no+=1                     folders.append(os.path.join(root,dd)) ############     移动文件      ----------------------------------------->>>>>>>>>>>>>>>           if dirs!= and files!=:             if len(files) <= 6:                 ff=                 for file in ff:                     if file.find('~$')>=0 or file.find('Thubms.db')>=0:                         ff.remove(file)             else:                 ff=             if len(ff)>1:                 try:                     os.mkdir(os.path.join(root,'95_old'))                 except Exception:                     pass             for file in files:                 try:                     shutil.move(os.path.join(root,file),os.path.join(root,'95_old\\'+file))                     file0+=1                 except Exception:                     pass         print('\n\n不合格文件夹如下:\n\n')     for x in folders:         print(x)       print('一共包含 {}  个文件夹。'.format(cnt_all))     print('一共移动了 {}  个文件到 95_old下面。'.format(file0))     print('一共修改了 {}  个文件夹。'.format(cnt))     print('一共失败了 {}  个文件夹。'.format(fail_no))     def folder_chk():     cnt=0     cnt_no1=0     cnt_no2=0     folders=     ############           ----------------------------------------->>>>>>>>>>>>>>>     for root, dirs, files in os.walk(r"检查路径2",topdown=False):         nn=0           if root.upper().find("PYPAK")==-1:             cnt+=1         else:             continue           if dirs!= and files!= and len(files)>=3:             cnt_no1+=1             folders.append(root)             print(root)           if re.match(r"\d{2,3}",root.rsplit('\\',1))==None:             cnt_no2+=1 ##            print(root)             folders.append(root)         print(cnt,cnt_no1,cnt_no2)   ##    print('\n\n不合格文件夹如下:\n\n') ##    for x in folders: ##        print(x)     print(cnt,cnt_no1,cnt_no2)     if __name__ == '__main__':       folder_chk()  
如何让图片透明
import sys sys.path.append(r"PAK路径")     # -*- coding: utf-8 -*- from PIL import Image   def trans_PNG(initial_pic, new_pic):     '''     to get a transparent picture     :param initial_pic: initial picture's path     :param new_pic: the transparent picture's path     :return:     '''     img = Image.open(initial_pic)     #将图片转换为四通道,而第四个通道是我们要修改的透明度,     #值可以设置成0-255之间的值,透明度会不太一样,看脑洞有多大咯。     img = img.convert("RGBA")     x, y = img.size       for i in range(x):         for j in range(y):                 #取四个通道的值,然后用切片取前三个不变,最后一个改为240             color = img.getpixel((i, j))             color = color + (240,)             img.putpixel((i, j), color)           #将白色及近似白色的地方改成半透明         datas = img.getdata()         new_data = list()         for item in datas:             if item > 220 and item > 220 and item > 220:                 new_data.append((255, 255, 255, 0))             else:                 new_data.append(item)         img.putdata(new_data)         img.save(new_pic, "PNG")   if __name__ == '__main__':       trans_PNG(r'H:\AA\w22.PNG', r'H:\AA\w221.PNG')     print('End')
pdf转换2
import sys sys.path.append(r"pak路径")     # -*- coding: utf-8 -*- import fitz   _author_ = '张起凡' import glob import datetime import os     # fitz就是pip install PyMuPDF def pyMuPDF_fitz(pdfPath, imagePath, count):     startTime_pdf2img = datetime.datetime.now()  # 开始时间     print("pdfPath=" + pdfPath)     print("imagePath=" + imagePath)     pdfDoc = fitz.open(pdfPath)         for pg in range(pdfDoc.page_count):         page = pdfDoc         rotate = int(0)         file_pre=os.path.basename(file).split('.')         # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。         # 此处若是不做设置,默认图片大小为:792X612, dpi=96         zoom_x = 4  # (1.33333333-->1056x816)   (2-->1584x1224)         zoom_y = 4           mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)           rect = page.rect         clip = fitz.Rect(rect.tl + 15, rect.br - 13)           pix = page.get_pixmap(matrix=mat, alpha=False, clip=clip)           if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在             os.makedirs(imagePath)  # 若图片文件夹不存在就创建             pix.save(imagePath + '/' + file_pre +'_%s_%s.jpg' % (count, pg))  # 将图片写入指定的文件夹内         print(pg)       endTime_pdf2img = datetime.datetime.now()  # 结束时间     print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)     if __name__ == "__main__":     # 1、PDF地址     pdfPath = r"H:\AA"     # 2、需要储存图片的目录     imagePath = r"H:\AA"     # 3.文件后缀数字     count = 1     # 4.获取文件     files = glob.glob(pdfPath + r'\*.pdf')     # 5.循环调用函数进行转化     for file in files:         pyMuPDF_fitz(file, imagePath, count)         count = count + 1  
pdf的转换
# -*- coding: utf-8 -*- import fitz   _author_ = '张起凡' import glob import datetime import os     # fitz就是pip install PyMuPDF def pyMuPDF_fitz(pdfPath, imagePath, count):     startTime_pdf2img = datetime.datetime.now()  # 开始时间     print("pdfPath=" + pdfPath)     print("imagePath=" + imagePath)     pdfDoc = fitz.open(pdfPath)     for pg in range(pdfDoc.pageCount):         page = pdfDoc         rotate = int(0)         # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。         # 此处若是不做设置,默认图片大小为:792X612, dpi=96         zoom_x = 4  # (1.33333333-->1056x816)   (2-->1584x1224)         zoom_y = 4         mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)         rect = page.rect         clip = fitz.Rect(rect.tl + 15, rect.br - 13)         pix = page.get_pixmap(matrix=mat, alpha=False, clip=clip)           if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在             os.makedirs(imagePath)  # 若图片文件夹不存在就创建           pix.save(imagePath + '/' + 'images_%s_%s.jpg' % (count, pg))  # 将图片写入指定的文件夹内       endTime_pdf2img = datetime.datetime.now()  # 结束时间     print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)     if __name__ == "__main__":     # 1、PDF地址     pdfPath = r"D:\图纸识别\中核\设计院CAM系统设计输入"     # 2、需要储存图片的目录     imagePath = r"D:\图纸识别\中核\设计院CAM系统设计输入\PDF1"     # 3.文件后缀数字     count = 1     # 4.获取文件     files = glob.glob(pdfPath + r'\*.pdf')     # 5.循环调用函数进行转化     for file in files:         pyMuPDF_fitz(file, imagePath, count)         count = count + 1
正则表达式常用元字符整理小结
正则表达式常用元字符整理小结  更新时间:2012年06月07日 15:03:59   投稿:mdxy-dxy     以下关于正则表达式的内容来自 MSDN 和维基百科,仅供自己查阅方便   正则表达式元字符和普通字符:根据正则表达式语法规则,正则表达式的匹配模式是由一系列的字符构成的。 一.普通字符: 大多数的字符仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。也就是说普通字符只能够匹配字符串中与它们相同的字符。二.元字符:由于普通字符只能匹配与自身相同的字符,那么正则表达式的灵活性和强大的匹配功能就不能够完全展现,于是正则表达式中还规定了一系列的特殊字符,这些特殊字符不是按照字符的直接量进行匹配的,而是具有特殊的语义, 例如下面如下字符: ^ $ . * + ? = ! : | \ / ( ) { } 虽然说上面的字符具有特殊含义,但是某些字符只有在某些上下文环境中才具有特殊的含义。如果要匹配这些具有特殊含义的字符直接量,需要在这些字符前面加反斜杠(\)进行转义,例如我想匹配一个$直接量,需要写成\$,否则就是匹配一个结尾位置。正是由于这些特殊字符的存在,才会是正则表达式具有强大的功能。由于它们是构造各种匹配复杂文本的正则表达式的基本字符,所以被称作元字符。 元字符的用法会在后面的章节中得到介绍,这里只是介绍一下此概念。正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。元字符使正则表达式具有处理能力。元字符既可以是放在 中的任意单个字符(如 表示匹配单个小写字符 a ),也可以是字符序列(如 表示匹配 a 、 b 、 c 、 d 之间的任意一个字符,而 \w 表示任意英文字母和数字及下划线),下面是一些常见的元字符: . 匹配除 \n 以外的任何字符(注意元字符是小数点)。 匹配 abcde 之中的任意一个字符 匹配 a 到 h 之间的任意一个字符 不与 fgh 之中的任意一个字符匹配\w 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于 \W 不匹配大小写英文字符及数字 0 到 9 之间的任意一个,相当于 \s 匹配任何空白字符,相当于 \S 匹配任何非空白字符,相当于 \d 匹配任何 0 到 9 之间的单个数字,相当于 \D 不匹配任何 0 到 9 之间的单个数字,相当于 匹配任意单个汉字(这里用的是 Unicode 编码表示汉字的 )正则表达式限定符上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符。下面是一些常见的限定符 ( 下表中 n 和 m 都是表示整数,并且 0<n<m) :* 匹配 0 到多个元字符,相当于 {0,}? 匹配 0 到 1 个元字符,相当于 {0,1}{n} 匹配 n 个元字符{n,} 匹配至少 n 个元字符{n,m} 匹配 n 到 m 个元字符+ 匹配至少 1 个元字符,相当于 {1,}\b 匹配单词边界^ 字符串必须以指定的字符开始$ 字符串必须以指定的字符结束说明:( 1 )由于在正则表达式中“ \ ”、“ ? ”、“ * ”、“ ^ ”、“ $ ”、“ + ”、“(”、“)”、“ | ”、“ { ”、“ \d{8}$ 表示任意以 13 开头的移动手机号码。( 3 )另外对于中文字符的匹配是采用其对应的 Unicode 编码来匹配的,对于单个 Unicode 字符,如 \u4e00 表示汉字“一”, \u9fa5 表示汉字“龥”,在 Unicode 编码中这分别是所能表示的汉字的第一个和最后一个的 Unicode 编码,在 Unicode 编码中能表示 20901 个汉字。( 4 )关于 \b 的用法,它代表单词的开始或者结尾,以字符串“ 123a 345b 456 789d ”作为示例字符串,如果正则表达式是“ \b\d{3}\b ”,则仅能匹配 456 。( 5 )可以使用“ | ”来表示或的关系,例如 表示匹配 z 、 j 、 q 之中的任意一个字母。 表达式 匹配 /^\s*$/ 匹配空行。 /\d{2}-\d{5}/ 验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 /<\s*(\S+)(\s*)?>*<\s*\/\1\s*>/ 匹配 HTML 标记。 下表包含了元字符的完整列表以及它们在正则表达式上下文中的行为: 字符 说明 \ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。 ^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配。 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与“\n”或“\r”之前的位置匹配。 * 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于 {0,}。 + 一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}。 ? 零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}。 {n} n 是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配。 {n,} n 是非负整数。至少匹配 n 次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有 o。“o{1,}”等效于“o+”。“o{0,}”等效于“o*”。 {n,m} M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,“o{1,3}”匹配“fooooood”中的头三个 o。'o{0,1}' 等效于 ‘o?'。注意:您不能将空格插入逗号和数字之间。 ? 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o”。 . 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“”之类的模式。 (pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”。 (?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“or”字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 ‘industry|industries' 更经济的表达式。 (?=pattern) 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配“Windows 2000”中的“Windows”,但不匹配“Windows 3.1”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 (?!pattern) 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配“Windows 3.1”中的 “Windows”,但不匹配“Windows 2000”中的“Windows”。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 x|y 匹配 x 或 y。例如,'z|food' 匹配“z”或“food”。'(z|f)ood' 匹配“zood”或“food”。 字符集。匹配包含的任一字符。例如,“”匹配“plain”中的“a”。 反向字符集。匹配未包含的任何字符。例如,“”匹配“plain”中的“p”。 字符范围。匹配指定范围内的任何字符。例如,“”匹配“a”到“z”范围内的任何小写字母。 反向范围字符。匹配不在指定的范围内的任何字符。例如,“”匹配任何不在“a”到“z”范围内的任何字符。 \b 匹配一个字边界,即字与空格间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”。 \B 非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”。 \cx 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。 \d 数字字符匹配。等效于 。 \D 非数字字符匹配。等效于 。 \f 换页符匹配。等效于 \x0c 和 \cL。 \n 换行符匹配。等效于 \x0a 和 \cJ。 \r 匹配一个回车符。等效于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等。与 等效。 \S 匹配任何非空白字符。与 等效。 \t 制表符匹配。与 \x09 和 \cI 等效。 \v 垂直制表符匹配。与 \x0b 和 \cK 等效。 \w 匹配任何字类字符,包括下划线。与“”等效。 \W 与任何非单词字符匹配。与“”等效。 \xn 匹配 n,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码。 \num 匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符。 \n 标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 \nm 标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符m。如果两种前面的情况都不存在,则 \nm 匹配八进制值 nm,其中 n 和 m 是八进制数字 (0-7)。 \nml 当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml。 \un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。   用户名 /^{3,16}$/ 密码 /^{6,18}$/ 十六进制值 /^#?({6}|{3})$/ 电子邮箱 /^(+)@(+.)+w{2,4}$/ /^(+)@(+).({2,6})$/ /^+(.+)*@((-)?)+(.{1,2}+)+$/ URL /^(https?://)?(+).({2,6})(*)*/?$/ /^(https?://)?(+.)+w{2,4}(/+)*$/ IP 地址 /((2d|25|?dd?).){3}(2d|25|?dd?)/ 或 /^(?:(?:25|2|??).){3}(?:25|2|??)$/ HTML 标签 /^<(+)(+)*(?:>(.*)</1>|s+/>)$/
正则01
正则替换文档里面的中文字符   匹配双字节字符(包括汉字在内)   .*{1,}.*   或者  (notepad+++里面不能匹配)  或者     苟利国家生死以,岂因福祸避趋之!
如何用js控制浏览器的滚动条
如何用js控制浏览器的滚动条? 找到好久,没有办法,那位大神帮忙下啊,谢谢了。
问大神0815
我想改变坐标轴标签的颜色,这个地方没有定义变量的界面 下面是测试的js, 一运行就显示这个,没报错
个人成就
内容被浏览47,919
加入社区2年336天
返回顶部