python查询windows文件

闲着没事,使用python写了一个查询windows中盘符文件的程序

代码:

import os
import winreg

class Find_assign_file:
    """
    drive 要查找的主路径,这是一个列表
    file_find 要查找的文件名
    file_mode 查找形式
    信息为:
        'i' 无误查找,根据用户输入的完整的文件名以及后缀信息进行查找
        'h' 半模糊查找,根据用户输入的不包括后缀信息的文件名进行查找
        'd' 模糊查找,根据用户输入的部分文件名信息进行查找
        以上三种模式全部是根据用户名进行查找,使用时应与下面的mode='f'关联使用
    mode 查找模式
        'f' 文件名查找,根据用户输入的文件名信息对相应路径下寻找特定文件
        'c' 文件内容查找,根据用户输入的文件中的信息查找相应的可能文件
    """
    def __init__(self, drive, file_find, file_mode, mode=''):
        self._subKey = 'SYSTEM\MountedDevices'
        self.drive = drive
        self.file_find = file_find
        self.file_mode = file_mode
        self.mode = mode

    def GetPartitionNames(self):
        '''通过注册表获取系统盘符信息,并返回一个包含盘符信息的列表'''
        res = []
        key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self._subKey)
        i = 0
        try:
            while True:
                name, value, type = winreg.EnumValue(key, i)
                if name.startswith('\\DosDevices\\'):
                    res.append((name, repr(value)[1:17]))
                i += 1
        except WindowsError:
            pass
        res = [i[0][12:] + '/' for i in res]
        return res

    def find_begin(self, path):
        """
        递归遍历每一个文件夹
        :param path:
        :return:
        """
        for file_path in path:
            try:
                if os.path.isdir(file_path):  # 如果是目录
                    list = os.listdir(file_path)
                    if self.file_mode == 'f':
                        # 用户查找特定目录
                        self.find_input(list, file_path)
                    if len(list) != 0:  # 如果目录不为空
                        list = [file_path + '/' + j for j in list]
                        # 递归
                        self.find_begin(list)
                    else:
                        # print('{}---目录为空'.format(file_path))
                        pass
                else:
                    # 用户选择为根据文件内容进行查找特定文件
                    if self.file_mode == 'c':
                        with open(file_path, 'r', encoding='utf-8', errors='ignore') as f:
                            content = f.read()
                            if self.file_find in content:
                                print(file_path)
                    else:
                        pass
            except NotADirectoryError:
                # print('{}---无效'.format(file_path))
                pass
            except PermissionError:
                # print('{}---拒绝访问'.format(file_path))
                pass

    def find_input(self, list, old_file_path):
        """
        根据用户的选择的mode进行相应的操作
        :param list:
        :param old_file_path:
        :return:
        """
        for file_name in list:
            # 根据完整的文件名加后缀查找文件,输出文件绝对路径
            if self.mode == 'i':
                if file_name == self.file_find:
                    print('---', old_file_path + '/' + file_name)
            # 根据完整的文件名进行查找,输出文件绝对路径
            elif self.mode == 'h':
                if file_name.split('.')[0] == self.file_find:
                    print('---', old_file_path + '/' + file_name)
            # 根据不完整的文件名进行查找,输出文件绝对路径
            elif self.mode == 'd':
                if self.file_find in file_name:
                    print('---', old_file_path + '/' + file_name)

    def get_every_file(self):
        """
        1.判断是否为用户输入路径
        2.如果使用用户输入的路径,则直接调用执行函数
        3.如果用户没有输入,则默认为系统全部盘符
        """
        if self.drive == '':
            self.drive = self.GetPartitionNames()
        else:
            self.drive = [self.drive]
        # 参数为一个包含路径信息的列表
        self.find_begin(self.drive)

def run():
    drive = input("要查找的文件主路径['path'] 不输入则查询所有盘符:")
    file_find = input("请输入文件名字或者文件中的部分内容:")
    file_mode = input("查找文件请输入f-查找内容文件请输入c:")
    if file_mode == 'f':
        mode = input("模式(i:完整文件名以及后缀)(h:完整文件名)(d:部分文件名):")
        path = Find_assign_file(drive, file_find, file_mode, mode)
    else:
        path = Find_assign_file(drive, file_find, file_mode)
    path.get_every_file()

if __name__ == "__main__":
    run()

部分使用说明:

1.使用完整文件名以及后缀查找文件名

2.使用完整文件名

3.使用部分文件名信息

4.通过文件内容查找文件名信息

共有以上几种方法

猜你喜欢

转载自www.cnblogs.com/hong976737/p/9356714.html