使用Python设计一个自动查询文件夹的exe文件



文章目录

  • 使用Python设计一个自动查询文件夹的exe文件
  • 前言
  • 一、消灭噩梦(~~摸鱼~~ )的开始
  • 二、~~摸鱼~~ 效果升级——添加拷贝功能
  • 1.引入库与库的使用
  • 2.实际使用方式
  • 三、~~摸鱼~~ 保障升级——添加查询历史记录功能
  • 1.引入库与库的使用
  • 2.实际使用方式
  • 四、升级为三台联机查询
  • 五、~~摸鱼~~ 升级为自动获取当天日期并查询七天内
  • 六、打包程序成.exe文件
  • 七、稍微说明一下


前言

由于在工作中时不时得帮查询某天文件夹下的图片,手动(指人为操作使用文件夹搜索查询文件)查询会比较麻烦,因为机器有三台,而且每台每天的图片文件夹都有四千个左右,并且有时候需查询的文件日期不是同一天的,甚至不知道是哪一天的,所以啊,总不能每天上班就是在查询图片文件夹中度过吧?我还要学习、还要干其他、还要打游戏咧


一、消灭噩梦(摸鱼


使用到的库比较普遍,也就是os和sys,它俩都是Python自带的库,无需下载。为了稍微美观一点,加了一个简单的图形用户显示界面,用到的库是easygui,这个库得下载。
而且吧,本人觉得上边的参考链接里的内容写得挺好,本人这程序就是由它那里演变而来的,所以这里的代码暂时先用那位博主的。

查询文件并使用图形用户显示界面代码如下:
(注意这是能查询文件,不是文件夹,文件名要带有后缀的)

import os               #引入操作系统模块
import sys      		#用于标准输入输出
import easygui as g     #引入图形用户界面
 
def search(path1,name):
    Allfiles = []           #创建队列
    Allfiles.append(path1)
        
    while len(Allfiles) != 0:    	#当队列中为空的时候跳出循环
        path =Allfiles.pop(0)    	#从队列中弹出首个路径
        if os.path.isdir(path): 	#判断路径是否为目录
            ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
            for line in ALLFilePath:
                newPath =path +"\\"+line   #形成绝对路径
                Allfiles.append(newPath)
        else:   #如果是一个文件,判断是否为目标文件
            target = os.path.basename(path)
            if target == name:
                return path
    return -1
 
path = g.enterbox(msg='请输入文件目录(如:D:DEV)')
name = g.enterbox(msg='请输入您要查找的文件名:')
answer = search(path,name)
if answer == -1:
    g.msgbox("查无此文件",'查找错误')
else:
    g.msgbox(answer,'返回路径')

若要改成即可查询文件夹又可查询文件的,则应该:

import os               #引入操作系统模块
import sys      		#用于标准输入输出
import easygui as g     #引入图形用户界面
 
def search(path1,name):
    Allfiles = []           #创建队列
    Allfiles.append(path1)
        
    while len(Allfiles) != 0:    	#当队列中为空的时候跳出循环
        path =Allfiles.pop(0)    	#从队列中弹出首个路径
        if os.path.isdir(path): 	#判断路径是否为目录
            ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
            for line in ALLFilePath:
                newPath =path +"\\"+line   #形成绝对路径
                if line == name:
                	return newPath
                Allfiles.append(newPath)
        else:   #如果是一个文件,判断是否为目标文件
            target = os.path.basename(path)
            if target == name:
                return path
    return -1
 
path = g.enterbox(msg='请输入文件目录(如:D:DEV)')
name = g.enterbox(msg='请输入您要查找的文件名:')
answer = search(path,name)
if answer == -1:
    g.msgbox("查无此文件",'查找错误')
else:
    g.msgbox(answer,'返回路径')

二、摸鱼

1.引入库与库的使用

import shutil #用于复制和粘贴文件
该shutil库也是自带的,无需下载。

使用shutil库代码如下(示例):

#文件、文件夹的移动、复制、删除、重命名
 
#导入shutil模块和os模块
import shutil,os
 
#复制单个文件
shutil.copy("C:\\a\\1.txt","C:\\b")
#复制并重命名新文件
shutil.copy("C:\\a\\2.txt","C:\\b\\121.txt")
#复制整个目录(备份)
shutil.copytree("C:\\a","C:\\b\\new_a")
 
#删除文件
os.unlink("C:\\b\\1.txt")
os.unlink("C:\\b\\121.txt")
#删除空文件夹
try:
    os.rmdir("C:\\b\\new_a")
except Exception as ex:
    print("错误信息:"+str(ex))#提示:错误信息,目录不是空的
#删除文件夹及内容
shutil.rmtree("C:\\b\\new_a")
 
#移动文件
shutil.move("C:\\a\\1.txt","C:\\b")
#移动文件夹
shutil.move("C:\\a\\c","C:\\b")
 
#重命名文件
shutil.move("C:\\a\\2.txt","C:\\a\\new2.txt")
#重命名文件夹
shutil.move("C:\\a\\d","C:\\a\\new_d")

使用得不明白的可以参考以下代码进行调试:

import shutil,os

def aa():
    #移动文件
    #第一个参数为目标文件的路径+目标文件名,第二个参数为放置路径(指明到哪个文件夹内即可,不需要还加上\\)
    shutil.move("G:\\111\\老机器.txt","E:\\222")

    #移动文件夹
    #第一个参数为目标文件夹的路径+目标文件夹名,第二个参数为放置路径(指明到哪个文件夹内即可,不需要还加上\\)
    shutil.move("E:\\222\\3","G:\\111")

aa()

多练练,就弄明白怎么使用了,一开始用时可能有那么点乱,至少当时本人是有点乱的,老是莫名其妙报错。


2.实际使用方式

以下是结合与使用的代码:(当然这些代码里边有些不堪入目简称为幼稚的地方,大家自行忽略就好哈!)

import os       #引入操作系统模块
import sys      #用于标准输入输出
import easygui as g     #引入图形用户界面  
import shutil   #用于复制和粘贴文件

def search(path1,name):
    Allfiles = []           #创建队列
    Allfiles.append(path1)
        
    while len(Allfiles) != 0:    #当队列中为空的时候跳出循环
        path =Allfiles.pop(0)    #从队列中弹出首个路径
        if os.path.isdir(path): #判断路径是否为目录
            ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
            for line in ALLFilePath:
                newPath =path +"\\"+line   #形成绝对路径
                if line == name:
                    return newPath
                Allfiles.append(newPath)
                
        else:   #如果是一个文件,判断是否为目标文件
            target = os.path.basename(path)
            if target == name:
                return path
    return -1

msg = '查板测试'
title = '查询板子'
fields=['查询地址:','查询文件名:','粘贴地址:']
values=['\\\\192.168.1.101\\钉钉','','G:\\111\\']
if __name__ == '__main__':
	while True:
	    try:
	        list = g.multenterbox(msg, title, fields, values)   #会返回存有三个元素的列表,为:'查询地址:','查询文件名:','粘贴地址:'
	        answer = search(list[0],list[1])
	
	        #absolute_path = list[2] + list[1]  #直接将路径与文件名结合,得到绝对存放路径,并且还自动命名
	        absolute_path = list[2] +'\\'+ list[1]
	        
	#以下打印输出是为了摸清楚哪出了问题用的
	        #path = list[2]  #这个是粘贴地址
	        #print(list)
	        #print('list[0] 查询地址:',list[0])
	        #print('list[1] 查询文件名:',list[1])
	        #print('list[2]粘贴地址:',list[2])
	        #print('absolute_path绝对存放路径:',absolute_path)
	        #print('answer 输出',answer)   #输出:查询地址+查询文件名
	
	        if answer == -1:
	            g.msgbox("查无此文件",'查找错误')
	        else:
	            g.msgbox(msg=answer,title='返回路径')
	            #shutil.copy(answer,absolute_path)  #只能用于查询文件,如:老机器.txt
	 
	            shutil.copytree(answer,absolute_path) #只能用于查询文件夹
	
	    except TypeError:
	        break
	    except:
	        g.msgbox("抱歉,出错了~_~",'报警')
	        
	        hint = g.buttonbox(msg='程序运行错误,是否重新开始程序???', title='提示', choices=('重开吧', '还想继续瞅瞅', '退出程序'))
	        if hint == '重开吧':
	            pass
	        elif hint == '还想继续瞅瞅':
	            talk_back = g.ccbox(msg='你瞅啥?!', title='报警', choices=('瞅你咋地', '我怕了行么'), image=None)
	            print(talk_back)
	            if talk_back == True:
	                while True:
	                    talk_back_1 = g.ccbox(msg='再瞅一次试试?!', title='报警', choices=('试试就试试', '我怕了行么'), image=None)
	                    if talk_back_1 == True:
	                        g.msgbox("你完了,面对疾风吧!",'报警')
	                        while True:
	                            g.msgbox("你给我等着",'危',ok_button='哦')
	                    if talk_back_1 == False:
	                        g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
	                        break
	            elif talk_back == False:
	                g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
	                continue
	
	        else:
	            break

三、摸鱼

对每次查询的文件夹都进行记录,这样既方便整理数据,让数据一目了然,又避免因忘记而重复查询。

本是想用文本来保存就行了,但觉得写在文本上有点low,准确的说是不实用,文本上不能整理数据哇!所以就采用了CSV库写入表格中。

记录保存的表格会按照指定的路径创建,默认情况是放在跟程序同一文件夹下。


1.引入库与库的使用

因为没啥好解释的,人家博主写得好我就直接套用他的了,大家伙别太介意,反正之后也会进行代码改造的。

初步使用代码如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

# 导入CSV安装包
import csv

# 1. 创建文件对象
f = open('文件名.csv','w',encoding='utf-8',newline=’’ ")

# 2. 基于文件对象构建 csv写入对象
csv_writer = csv.writer(f)

# 3. 构建列表头
csv_writer.writerow(["姓名","年龄","性别"])

# 4. 写入csv文件内容
csv_writer.writerow(["l",'18','男'])
csv_writer.writerow(["c",'20','男'])
csv_writer.writerow(["w",'22','女'])

# 5. 关闭文件
f.close()

2.实际使用方式

实际使用代码如下:

import os       #引入操作系统模块
import sys      #用于标准输入输出
import easygui as g     #引入图形用户界面  
import shutil   #用于复制和粘贴文件
import csv      #用于生成CSV表格
import time


def r_csv(find_files_name,):
    # 1. 创建文件对象
    f = open('文件名.csv','w',encoding='utf-8')

    # 2. 基于文件对象构建 csv写入对象
    csv_writer = csv.writer(f)

    # 3. 构建列表头
    csv_writer.writerow(["文件名","路径","日期","机台号"])

    # 4. 写入csv文件内容
    csv_writer.writerow([list[1],list[2],date,number])  #对应了上面的四列输出
    #csv_writer.writerow(["c",'20','男'])
    #csv_writer.writerow(["w",'22','女'])

    # 5. 关闭文件
    f.close()


def search(path1,name):
    Allfiles = []           #创建队列
    Allfiles.append(path1)
        
    while len(Allfiles) != 0:    #当队列中为空的时候跳出循环
        path =Allfiles.pop(0)    #从队列中弹出首个路径
        if os.path.isdir(path): #判断路径是否为目录
            ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
            for line in ALLFilePath:
                newPath =path +"\\"+line   #形成绝对路径
                if line == name:
                    return newPath
                Allfiles.append(newPath)
                
        else:   #如果是一个文件,判断是否为目标文件
            target = os.path.basename(path)
            if target == name:
                return path
    return -1

def date_and_number():
    #answer = "E:\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\cnsha1luc02\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\10.116.223.95\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #一号机    10.116.223.75
    #二号机    10.116.223.95
    #三号机    10.116.223.60
    
    a,b,c = 1,1,1
    for index in range(len(answer)):
        if answer[index-1:index+1] == '02' and a == 1:
            if answer[index-2:index+2] != '2021':
                number = '一号机'
                print(number)
                a += 1
                b,c = a,a

        elif answer[index-1:index+1] == '03' and b == 1:
            number = '二号机'
            b += 1
            a,c = b,b

        elif answer[index-1:index+1] == '04' and c ==1:
            number = '三号机'
            c += 1
            a,b = c,c

        if answer[index] == "年":
            date = answer[index-4:index+6]  #截取查询地址(字符串)输出日期
            break

msg = '查板测试'
title = '查询板子'
fields=['查询地址:','查询文件名:','粘贴地址:']
values=['\\\\192.168.1.101\\钉钉','','G:\\111\\']

while True:
    try:

        list = g.multenterbox(msg, title, fields, values)   #会返回存有三个元素的列表,为:'查询地址:','查询文件名:','粘贴地址:'

        answer = search(list[0],list[1])

        #absolute_path = list[2] + list[1]  #直接将路径与文件名结合,得到绝对存放路径,并且还自动命名
        absolute_path = list[2] +'\\'+ list[1]
        #path = list[2]  #这个是粘贴地址

#以下打印输出是为了摸清楚哪出了问题用的
        #print(list)
        #print('list[0] 查询地址:',list[0])
        #print('list[1] 查询文件名:',list[1])
        #print('list[2]粘贴地址:',list[2])
        #print('absolute_path绝对存放路径:',absolute_path)
        #print('answer 输出',answer)   #输出:查询地址+查询文件名

        #date_and_number()       #用于获取日期和机台号(给写入CSV表格用的)

        if answer == -1:
            g.msgbox("查无此文件",'查找错误')
        else:
            g.msgbox(msg=answer,title='返回路径')
            #shutil.copy(answer,absolute_path)  #只能用于查询文件,如:老机器.txt
 
            shutil.copytree(answer,absolute_path)

    except TypeError:
        break
    except:
        g.msgbox("抱歉,出错了~_~",'报警')
        
        hint = g.buttonbox(msg='程序运行错误,是否重新开始程序???', title='提示', choices=('重开吧', '还想继续瞅瞅', '退出程序'))
        if hint == '重开吧':
            pass
        elif hint == '还想继续瞅瞅':
            talk_back = g.ccbox(msg='你瞅啥?!', title='报警', choices=('瞅你咋地', '我怕了行么'), image=None)
            print(talk_back)
            if talk_back == True:
                while True:
                    talk_back_1 = g.ccbox(msg='再瞅一次试试?!', title='报警', choices=('试试就试试', '我怕了行么'), image=None)
                    if talk_back_1 == True:
                        g.msgbox("你完了,面对疾风吧!",'报警')
                        while True:
                            g.msgbox("你给我等着",'危',ok_button='哦')
                    if talk_back_1 == False:
                        g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                        break
            elif talk_back == False:
                g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                continue

        else:
            break

四、升级为三台联机查询

代码如下:

import os       #引入操作系统模块
import sys      #用于标准输入输出
import easygui as g     #引入图形用户界面  
import shutil   #用于复制和粘贴文件
import csv      #用于生成CSV表格
import datetime #用于获取当前时间
import time


def r_csv(find_files_name, answer_path, date, host_ID, date_t_time):
    #该函数用于创建表格并记录查询内容
    try:

        # 1. 创建文件对象路径
        csv_path = list[4] + '\\' + '历史查询记录.csv'

        # 2. 判断是否存在即将要生成/写入的表格
        if os.path.exists(csv_path) == False:   #如果该文件/文件夹不存在,则加入列表头
            # 3. 创建文件对象
            f = open(csv_path, 'a', encoding='utf-8',newline='' "")     #加上newline='' ""是为了除去写入的数据出现一行空白
            # 4. 基于文件对象.构建 csv写入对象
            csv_writer = csv.writer(f)
            # 5. 构建列表头
            csv_writer.writerow(["文件名","路径","日期","机台号","查询日期"])

        elif os.path.exists(csv_path) == True:  #如果该文件/文件夹存在,则不加入列表头
            print('不加入列表头')
            f = open(csv_path, 'a', encoding='utf-8',newline='' "")     #加上newline='' ""是为了除去写入的数据出现一行空白
            csv_writer = csv.writer(f)

        # 6. 写入csv文件内容
        csv_writer.writerow([find_files_name, answer_path, date, host_ID, date_t_time])  #对应了上面的四列输出
        # 7. 关闭文件
        f.close()

    except OSError:
        print('表格还在打开着,请关闭')
        g.msgbox("表格还在打开着,请关闭",'提示')

#查询文件名
name = '11'
    
#查询地址
path_1 = "\\\\10.116.223.75\\E\\图片\\2021年11月8日\\Bay26_PCBA004-A-RT_F"# + '\\' + name
path_2 = "\\\\10.116.223.95\\E\\图片\\2021年11月8日\\Bay26_PCBA004-A-RT_F"# + '\\' + name
path_3 = "\\\\10.116.223.60\\E\\图片\\2021年11月8日\\Bay26_PCBA004-A-RT_F"# + '\\' + name

#path_1 = "G:\\111\\"# + '\\' + name
#path_2 = "E:\\222"# + '\\' + name
#path_3 = "H:\\333"# + '\\' + name

#粘贴地址
path_4 = "E:\\查询文件"# + '\\' + name

#输出访问/粘贴文件夹时的时间
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

def search(path_1, path_2, path_3, name): #用于寻找正确的路径
    Allfiles = []           #创建队列
    Allfiles.append(path_1) #0
    Allfiles.append(path_2) #1
    Allfiles.append(path_3) #2
        
    while len(Allfiles) != 0:    #当队列中为空的时候跳出循环
        q = 0
        while q < len(Allfiles):
            path =Allfiles.pop(0)    #从队列中弹出首个路径
            q += 1
            if os.path.isdir(path): #判断路径是否为目录
                ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
                for line in ALLFilePath:
                    newPath =path +"\\"+line   #形成绝对路径
                    if line == name:
                        return newPath
                    Allfiles.append(newPath)
                
            else:   #如果是一个文件,判断是否为目标文件
                target = os.path.basename(path)
                if target == name:
                    return path
                    #print(path)
    return -1

def date_and_host_ID(path):
    #answer = "E:\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\cnsha1luc03\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\10.116.223.95\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #一号机    10.116.223.75
    #二号机    10.116.223.95
    #三号机    10.116.223.60
    
    a,b,c,d = 1,1,1,1
    date = '未知1'
    host_ID = '未知2'
    for index in range(len(path) or path):    #遍历返回的路径
        if path[index-1:index+1] == '75' and a == 1:  #判断路径字符串中是否存在'75'并且是第一次出现的
            if path[index-2:index+1] == '.75':   #再判断与'75'前两个字符组合起来是不是不等于'.75'
                host_ID = '一号机'
                #host_ID_ID = host_ID
                print(host_ID)
                a += 1
                b,c = a,a

        elif path[index-1:index+1] == '95' and b == 1:    #第一次出现'95'的字符串则判定为二号机
            host_ID = '二号机'
            #host_ID_ID = host_ID
            b += 1
            a,c = b,b

        elif path[index-1:index+1] == '60' and c ==1:     #第一次出现'60'的字符串则判定为三号机
            host_ID = '三号机'
            #host_ID_ID = host_ID
            c += 1
            a,b = c,c

        elif a == 1 and b == 1 and c == 1:
            host_ID = '未知机台'
            
        if path[index] == "年" and d == 1:
            
            if path[index+4] == "日":
                date = path[index-4:index+5]  #截取查询地址(字符串)输出日期
                #break
                d += 1
            elif path[index+5] == "日":
                date = path[index-4:index+6]  #截取查询地址(字符串)输出日期
                #break
                d += 1
            elif path[index+6] == "日":
                date = path[index-4:index+7]  #截取查询地址(字符串)输出日期
                #break
                d += 1
        elif d == 1:
            date = '未知日期'

    return date, host_ID

    #将文件夹的日期转化成系统知道的日期
    time1 = datetime.datetime.strptime(date,'%Y年%m月%d日')
    print(time1)

    #将日期减一天
    add_days = time1-datetime.timedelta(days=1)
    print(add_days)     #2021-11-10 00:00:00

    #再将日期转化回字符串,不然不能更改里边的内容,因为需要使日期以xx年xx月xx日来显示
    time1_str = datetime.datetime.strftime(add_days,'%Y-%m-%d %H:%M:%S')
    print(time1_str)

    a,b,c,d = 1,1,1,1

    for index in range(len(time1_str) or time1_str):    #遍历返回的路径

        if time1_str[index] == "-" and d == 1:
            str_1 = time1_str[index-4:index] + '年'
            d += 1
            print('str_1:',str_1)

        elif time1_str[index] == "-" and d == 2:
            str_2 = time1_str[index-2:index] + '月'
            print('str_2:',str_2)
            #去除月份开头的0,如02月变为2月
            if str_2[0] == '0':
                str_2 = str_2[1:]

            str_3 = time1_str[index+1:index+3] + '日'
            print('str_3:',str_3)
            d += 1
            #去除日开头的0,如01日变为1日
            if str_3[0] == '0':
                str_3 = str_3[1:]

    str_4 = str_1 + str_2 + str_3
    return str_4


msg = '查板测试(仅限于查询文件夹)'
title = '查询板子'
fields=['查询文件夹名:','查询地址1:','查询地址2:','查询地址3:','粘贴地址:']
values=['', path_1, path_2, path_3, path_4]


if __name__ == '__main__':
    while True:
        try:
            list = g.multenterbox(msg, title, fields, values)   #会返回存有三个元素的列表,为:'查询地址:','查询文件名:','粘贴地址:'

            answer = search(list[1],list[2],list[3],list[0])
            if answer == -1:
                g.msgbox("查无此文件",'查找错误')
            else:
                g.msgbox(msg=answer,title='返回路径')
                #shutil.copy(answer,absolute_path)  #只能用于查询文件,如:老机器.txt
            
                #用于获取日期和机台号(给写入CSV表格用的),sa为返回的日期,ds为返回的机台号
                sa, ds = date_and_host_ID(answer)    #写入三个参数,分别是日期、机台号、路径查询结果,只返回日期和机台号
                #用于生成并写入表格
                r_csv(list[0], answer, sa, ds, now_time)

                #!!!!还得增加一个判断 ,用于判断查询的是文件还是文件夹
                absolute_path = list[4] +'\\'+ list[0] + ds  #在粘贴后的文件名重命名为 SN+机台号
                shutil.copytree(answer,absolute_path)

        except TypeError:
            break
        except:
            g.msgbox("抱歉,出错了~_~",'报警')
        
            hint = g.buttonbox(msg='程序运行错误,是否重新开始程序???', title='提示', choices=('重开吧', '还想继续瞅瞅', '退出程序'))
            if hint == '重开吧':
                pass
            elif hint == '还想继续瞅瞅':
                talk_back = g.ccbox(msg='你瞅啥?!', title='报警', choices=('瞅你咋地', '我怕了行么'), image=None)
                print(talk_back)
                if talk_back == True:
                    while True:
                        talk_back_1 = g.ccbox(msg='再瞅一次试试?!', title='报警', choices=('试试就试试', '我怕了行么'), image=None)
                        if talk_back_1 == True:
                            g.msgbox("你完了,面对疾风吧!",'报警')
                            while True:
                                g.msgbox("你给我等着",'危',ok_button='哦')
                        if talk_back_1 == False:
                            g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                            break
                elif talk_back == False:
                    g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                    continue

            else:
                break

五、摸鱼

大概就是因为懒吧,懒得逐个翻那么多天的文件夹,就索性让程序替我挨个访问挨个查询,当然,这个功能目前可能还不是很完善,甚至查询的时间比较久 (当显示的页面在查询时会自动消失,并不是闪退,而是正在查询文件,不信可以打开“任务管理器”看看它是否在后台运行着) ,然后因为现场的三台设备中有两台不知怎滴,不能相互访问对方的共享文件夹,一直在等待着,可能就是这个缘故所以自动跳跃日期查询功能验证失败,也就查不到文件夹,之后的话应该还会用其他两台电脑共享起来再试试这个功能是否可行,按思路应该是对的。

还有呢,查询速度的问题应该还可以继续优化以下的,本人猜测目前都是单个机台或单个文件夹去查询文件,那若换成多线程查询呢?是不是快了许多?————有待验证

import os       #引入操作系统模块
import sys      #用于标准输入输出
import easygui as g     #引入图形用户界面  
import shutil   #用于复制和粘贴文件
import csv      #用于生成CSV表格
import datetime #用于获取当前时间
import time

def Get_date_of_the_day():           #这里的时间转换可能有点乱和错!!!!!
    #先是自动获取当天的日期,并更改显示在文本输入框内
    now_time = datetime.datetime.now().strftime('%Y-%m-%d') #获取当前日期,并转换格式为只显示日期不显示时间
    print('这是系统日期,不是str:',now_time)

    #转换系统日期为字符串str  
    #字符串转datetime:
    time1 = datetime.datetime.strptime(now_time,'%Y-%m-%d')
    print('这是系统日期转换为str日期:',time1)

    #再将日期转化回字符串,不然不能更改里边的内容,因为需要使日期以xx年xx月xx日来显示
    #datetime转字符串:
    time1_str = datetime.datetime.strftime(time1,'%Y-%m-%d')
    print('由系统日期转换为str日期:',time1_str)

    #更改格式后的日期
    date_now = date_conversion(time1_str)
    print(date_now)
    return date_now     #得到当天时间字符串

def date_conversion(time1_str):
    #该函数用于将xxxx-xx-xx 转换为 xxxx年xx月xx日
    d = 1

    for index in range(len(time1_str) or time1_str):    #遍历返回的路径

        if time1_str[index] == "-" and d == 1:
            str_1 = time1_str[index-4:index] + '年'
            d += 1
            print('str_1:',str_1)

        elif time1_str[index] == "-" and d == 2:
            str_2 = time1_str[index-2:index] + '月'
            print('str_2:',str_2)
            #去除月份开头的0,如02月变为2月
            if str_2[0] == '0':
                str_2 = str_2[1:]

            str_3 = time1_str[index+1:index+3] + '日'
            print('str_3:',str_3)
            d += 1
            #去除日开头的0,如01日变为1日
            if str_3[0] == '0':
                str_3 = str_3[1:]

    str_4 = str_1 + str_2 + str_3
    return str_4#日期格式转换(字符串)

def site_add_date(date):
    #地址加上日期构成完整的路径
    path_1_1 = "\\\\10.116.223.75\\"
    path_2_1 = "\\\\10.116.223.95\\"
    path_3_1 = "\\\\10.116.223.60\\"

    path_0_1 = "E\\图片\\"
    path_0_2 = ""           #用来赋值日期。日期作为变量是为了能更方便的实现自动查询七天内的文件
    path_0_3 = "\\Bay26_PCBA004-A-RT_F"

    path_0_2 = date

    path_1 = path_1_1 + path_0_1 + path_0_2 + path_0_3
    path_2 = path_2_1 + path_0_1 + path_0_2 + path_0_3
    path_3 = path_3_1 + path_0_1 + path_0_2 + path_0_3

    #print(path_1) #得到重新组装好的地址1
    #print(path_2) #得到重新组装好的地址2
    #print(path_3) #得到重新组装好的地址3

    return path_1, path_2, path_3       #完整路径 = 地址 + 日期

def search(path_1, path_2, path_3, name): #用于寻找正确的路径
    Allfiles = []           #创建队列
    Allfiles.append(path_1) #0
    Allfiles.append(path_2) #1
    Allfiles.append(path_3) #2
        
    while len(Allfiles) != 0:    #当队列中为空的时候跳出循环
        q = 0
        while q < len(Allfiles):
            path =Allfiles.pop(0)    #从队列中弹出首个路径
            q += 1
            if os.path.isdir(path): #判断路径是否为目录
                ALLFilePath =os.listdir(path)    #若是目录,遍历将里面所有文件入队
                for line in ALLFilePath:
                    newPath =path +"\\"+line   #形成绝对路径
                    if line == name:
                        return newPath
                    Allfiles.append(newPath)
                
            else:   #如果是一个文件,判断是否为目标文件
                target = os.path.basename(path)
                if target == name:
                    return path
                    #print(path)
    return -1#寻找查询文件的路径并返回

def Date_minus_days(date_now):
    #将文件夹的日期转化成系统知道的日期(字符串-->时间戳)
    time1 = datetime.datetime.strptime(date_now,'%Y年%m月%d日')
    print(time1)

    #将日期减一天
    add_days = time1-datetime.timedelta(days=1)
    print('这是系统日期,日期减一天:',add_days)     #2021-11-10 00:00:00

    #再将日期转化回字符串,不然不能更改里边的内容,因为需要使日期以xx年xx月xx日来显示
    time1_str = datetime.datetime.strftime(add_days,'%Y-%m-%d')
    print('由系统日期转换为str日期:',time1_str)

    print('字符串长度:',len(time1_str))
    for kong in range(len(time1_str)):
        if time1_str[kong] == ' ':
            print('出现了空格')
            print(kong)
            time1_str = time1_str[:kong]
            print(time1_str)
        else:
            time1_str = time1_str
    return time1_str    #日期更改为前一天

def r_csv(find_files_name, answer_path, date, host_ID, date_t_time):
    #该函数用于创建表格并记录查询内容
    try:

        # 1. 创建文件对象路径
        csv_path = list[4] + '\\' + '历史查询记录.csv'

        # 2. 判断是否存在即将要生成/写入的表格
        if os.path.exists(csv_path) == False:   #如果该文件/文件夹不存在,则加入列表头
            # 3. 创建文件对象
            f = open(csv_path, 'a', encoding='utf-8',newline='' "")     #加上newline='' ""是为了除去写入的数据出现一行空白
            # 4. 基于文件对象.构建 csv写入对象
            csv_writer = csv.writer(f)
            # 5. 构建列表头
            csv_writer.writerow(["文件名","路径","日期","机台号","查询日期"])

        elif os.path.exists(csv_path) == True:  #如果该文件/文件夹存在,则不加入列表头
            print('不加入列表头')
            f = open(csv_path, 'a', encoding='utf-8',newline='' "")     #加上newline='' ""是为了除去写入的数据出现一行空白
            csv_writer = csv.writer(f)

        # 6. 写入csv文件内容
        csv_writer.writerow([find_files_name, answer_path, date, host_ID, date_t_time])  #对应了上面的四列输出
        # 7. 关闭文件
        f.close()

    except OSError:
        print('表格还在打开着,请关闭')
        g.msgbox("表格还在打开着,请关闭",'提示')#查询记录写入表格中

def date_and_host_ID(path):
    #answer = "E:\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\cnsha1luc03\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #answer = "\\\\10.116.223.95\\E\\图片\\2021年11月3日\\Bay26_PCBA004-A-RT_F\\"
    #一号机    10.116.223.75
    #二号机    10.116.223.95
    #三号机    10.116.223.60
    
    a,b,c,d = 1,1,1,1
    date = '未知1'
    host_ID = '未知2'
    for index in range(len(path) or path):    #遍历返回的路径
        if path[index-1:index+1] == '75' and a == 1:  #判断路径字符串中是否存在'75'并且是第一次出现的
            if path[index-2:index+1] == '.75':   #再判断与'75'前两个字符组合起来是不是不等于'.75'
                host_ID = '一号机'
                #host_ID_ID = host_ID
                print(host_ID)
                a += 1
                b,c = a,a

        elif path[index-1:index+1] == '95' and b == 1:    #第一次出现'95'的字符串则判定为二号机
            host_ID = '二号机'
            #host_ID_ID = host_ID
            b += 1
            a,c = b,b

        elif path[index-1:index+1] == '60' and c ==1:     #第一次出现'60'的字符串则判定为三号机
            host_ID = '三号机'
            #host_ID_ID = host_ID
            c += 1
            a,b = c,c

        elif a == 1 and b == 1 and c == 1:
            host_ID = '未知机台'
            
        if path[index] == "年" and d == 1:
            
            if path[index+4] == "日":
                date = path[index-4:index+5]  #截取查询地址(字符串)输出日期
                #break
                d += 1
            elif path[index+5] == "日":
                date = path[index-4:index+6]  #截取查询地址(字符串)输出日期
                #break
                d += 1
            elif path[index+6] == "日":
                date = path[index-4:index+7]  #截取查询地址(字符串)输出日期
                #break
                d += 1
        elif d == 1:
            date = '未知日期'

    return date, host_ID    #输出日期和机台号


#最后得到时间字符串
date_now = Get_date_of_the_day()  

#日期载入三个地址中
path_1, path_2, path_3 = site_add_date(date_now)
print(path_1)
print(path_2)
print(path_3)

#粘贴地址
path_4 = "E:\\查询文件"# + '\\' + name

#输出访问/粘贴文件夹时的时间
now_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')

msg = '查板测试(仅限于查询文件夹)'
title = '查询板子'
fields=['查询文件夹名:','查询地址1:','查询地址2:','查询地址3:','粘贴地址:']
values=['', path_1, path_2, path_3, path_4]

days = 1

if __name__ == '__main__':
    while True:
        try:
            list = g.multenterbox(msg, title, fields, values)   #会返回存有三个元素的列表,为:'查询地址:','查询文件名:','粘贴地址:'
            answer = search(list[1],list[2],list[3],list[0])

            if answer == -1:
                #将当天日期减去一天并重新查找(找昨天的日期进行查询,得到xxxx-xx-xx格式日期)
                minus_date = Date_minus_days(date_now)

                #将xxxx-xx-xx转换为xxxx年xx月xx日
                minus_date_1 = date_conversion(minus_date)

                #日期载入三个地址中
                path_1, path_2, path_3 = site_add_date(minus_date_1)

                values=['', path_1, path_2, path_3, path_4]
                list = g.multenterbox(msg, title, fields, values)   #会返回存有三个元素的列表,为:'查询地址:','查询文件名:','粘贴地址:'
                answer = search(list[1],list[2],list[3],list[0])
                days += 1
                if answer == -1 and days > 7:
                    g.msgbox("查无此文件",'查找错误')
                else:
                    g.msgbox(msg=answer,title='返回路径')
                    #shutil.copy(answer,absolute_path)  #只能用于查询文件,如:老机器.txt
            
                    #用于获取日期和机台号(给写入CSV表格用的),sa为返回的日期,ds为返回的机台号
                    sa, ds = date_and_host_ID(answer)    #写入三个参数,分别是日期、机台号、路径查询结果,只返回日期和机台号
                    #用于生成并写入表格
                    r_csv(list[0], answer, sa, ds, now_time)

                    #!!!!还得增加一个判断 ,用于判断查询的是文件还是文件夹
                    absolute_path = list[4] +'\\'+ list[0] + ds  #在粘贴后的文件名重命名为 SN+机台号
                    shutil.copytree(answer,absolute_path)
            else:
                g.msgbox(msg=answer,title='返回路径')
                #shutil.copy(answer,absolute_path)  #只能用于查询文件,如:老机器.txt
            
                #用于获取日期和机台号(给写入CSV表格用的),sa为返回的日期,ds为返回的机台号
                sa, ds = date_and_host_ID(answer)    #写入三个参数,分别是日期、机台号、路径查询结果,只返回日期和机台号
                #用于生成并写入表格
                r_csv(list[0], answer, sa, ds, now_time)

                #!!!!还得增加一个判断 ,用于判断查询的是文件还是文件夹
                absolute_path = list[4] +'\\'+ list[0] + ds  #在粘贴后的文件名重命名为 SN+机台号
                shutil.copytree(answer,absolute_path)

        except TypeError:
            break
        except:
            g.msgbox("抱歉,出错了~_~",'报警')
        
            hint = g.buttonbox(msg='程序运行错误,是否重新开始程序???', title='提示', choices=('重开吧', '还想继续瞅瞅', '退出程序'))
            if hint == '重开吧':
                pass
            elif hint == '还想继续瞅瞅':
                talk_back = g.ccbox(msg='你瞅啥?!', title='报警', choices=('瞅你咋地', '我怕了行么'), image=None)
                print(talk_back)
                if talk_back == True:
                    while True:
                        talk_back_1 = g.ccbox(msg='再瞅一次试试?!', title='报警', choices=('试试就试试', '我怕了行么'), image=None)
                        if talk_back_1 == True:
                            g.msgbox("你完了,面对疾风吧!",'报警')
                            while True:
                                g.msgbox("你给我等着",'危',ok_button='哦')
                        if talk_back_1 == False:
                            g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                            break
                elif talk_back == False:
                    g.msgbox("哼,知错就好",'提示',ok_button='嗯嗯嗯')
                    continue

            else:
                break

六、打包程序成.exe文件

当代码写好了,也尝试能用了,效果也有了,那就该打包了——这是一个非常可以装 *

生成exe文件参考链接

简单来说也就几个步骤:

  1. 安装pyinstaller
pip install pyinstaller
  1. Ctrl + R 输入:CMD,打开命令行,进入到存放将要生成exe文件的程序位置
cd C:\Users\Administrator\source\repos\find\find_2_11

得到:

Python打开文件中的句子并放入列表 python打开一个文件夹_Python打开文件中的句子并放入列表


3. 输入以下指令就可以自动生成了

pyinstaller -F -w main.py

然后在生成后的dist文件夹中能看到那个.exe文件,到时候直接拷贝这个文件到其他地方去都可以使用了(目前来说对本人是如此,不知道还会不会有其他问题)

上述的链接中还写有如何替换exe文件的图标,这个也挺有意思的。

但并没有写到不注意的话就会发生一些无语的事情,比如说:

  1. 打开exe文件时弹出一个对话框告诉你缺了某某某东西;
  2. 刚一打开文件就一闪而过;

对于第一个问题,多半是因为你的电脑中有几个关于Python的环境,然后写程序/安装本文章提到的所有库时并不是安装在打包用的那个环境中,这时候你应该先进入那个环境,然后再打包,这样才不会出问题。

activate tensorflow2.0(后面这是环境名)

pyinstaller -F -w main.py

对于第二个问题,不出意外的话就是程序运行出错了,想看到内容就将exe文件直接拖到命令行上运行,就能看到是什么问题了。


七、稍微说明一下

本篇文章的代码可能还有些不成熟,一个是因为没有使用到类将其包装起来,所以看起来毕竟low;二个是这个大概也许可能算是一个自己努力写了半个月后才得到的程序,并且是新出炉的,从2021.11.01开始写的,直到前天才写完,除了最后一个自动查询七天内文件的功能没能验证,其他功能应该也都没什么问题,只要使用者没有乱来,多半是可以用的,至少本人我用了没问题。