python扫描文件代码

前言

由于在公司接触大量的关于公民隐私的数据,所以才有了这个代码,菜鸟程序员,所以代码方面不是写的很漂亮。这篇代码是为了扫描出所有含有身份证号的excel,并移动到相应的文件夹内,创建日志、解压压缩包等,逻辑很简单,具体的可以看代码,都有注释。后面print()比较多,是因为最后我是把这篇代码用pyinstaller打包成exe程序,给其他同事使用。桌面窗口程序自己不是很熟练,所以没加。

当然根据这个代码,也可以写出像电脑管家杀毒那样,扫描所有文件,挑出你所需要的文件。

代码

# coding=utf-8

import os
import re
import sys
import xlrd
import time
import shutil
import zipfile
import datetime
from unrar import rarfile


class Logger(object):
    """
    重写log日志类方法
    """
    def __init__(self, fileN="Default.log"):
        self.terminal = sys.stdout
        self.log = open(fileN, "a")

    def write(self, message):
        self.terminal.write(message)
        self.log.write(message)

    def flush(self):
        pass


def traversal_zip(root_path):
    """
    扫描出所有的压缩文件,并输出路径
    :param root_path:
    :return:
    """
    list_rar = []
    list_zip = []
    list_7z = []
    list_files = os.walk(root_path)
    for dirpath, dirnames, filename in list_files:
        for file in filename:
            path_file = os.path.join(dirpath, file)
            if re.search("\.7z$", path_file):
                list_7z.append([dirpath, path_file])
            elif re.search("\.zip$", path_file):
                list_zip.append([dirpath, path_file])
            elif re.search("\.rar$", path_file):
                list_rar.append([dirpath, path_file])
            else:
                pass
    return list_zip, list_rar, list_7z


def traversal_xlsx(root_path):
    """
    扫描主目录下,所有的excel文件,并输出路径
    :param root_path:
    :return:
    """
    list_path_file = []
    list_path = []
    list_files = os.walk(root_path)
    for dirpath, dirnames, filename in list_files:
        for file in filename:
            path_file = os.path.join(dirpath, file)
            if re.search("\.XLSX$", path_file) or re.search("\.xlsx$", path_file) or re.search("\.XLS$",
                                                                                               path_file) or re.search(
                "\.xls$", path_file):
                list_path_file.append(path_file)
                list_path.append(dirpath)
            else:
                pass
    return list_path_file, list_path


def xlsx_nameid(xlsx_path, dirname, path):
    """
    打开Excel,判断是否有类似于身份证号码的列,如果有,移动到汇总文件夹
    :param xlsx_path:
    :param dirname:
    :return:
    """
    try:
        book = xlrd.open_workbook(xlsx_path)
        sheet = book.sheets()
        for m in range(len(sheet)):
            sheet1 = book.sheet_by_index(m)
            nrow = sheet1.nrows
            ncol = sheet1.ncols
            print("  工作簿{0},总行数/总列数:{1}/{2}".format(m + 1, nrow, ncol))
            for x in range(ncol):
                value = str(sheet1.cell(3, x).value).strip()
                if len(value) == 18:
                    print("    第{0}列第一检索条件符合:{1}".format(x + 1, value))
                    value1 = str(sheet1.cell(8, x).value).strip()
                    if len(value1) == 18:
                        print("    第{0}列第二检索条件符合:{1}".format(x + 1, value1))
                        value2 = str(sheet1.cell(nrow // 2, x).value).strip()
                        if len(value2) == 18:
                            print("    第{0}列第三检索条件符合:{1}".format(x + 1, value2))
                            xiugai_path = xlsx_path
                            xiugai_path1 = xiugai_path.replace("\\", "_").replace(":", "_")
                            print("      修改文件名,并移动", xiugai_path1)
                            os.rename(xlsx_path, path + "\\" + xiugai_path1)
                            shutil.move(path + "\\" + xiugai_path1, dirname)
                            print("      已移动到汇总文件夹")
                        else:
                            print("    第{0}列不符合第三检索条件".format(x + 1))
                    else:
                        print("    第{0}列不符合第二检索条件".format(x + 1))
                else:
                    print("    第{0}列不符合第一检索条件".format(x + 1))
    except BaseException as e:
        print(e)


def rar(path, zip_pathname, path1):
    """
    解压rar文件的函数
    :param path:
    :param path1:
    :return:
    """
    try:
        rar_name = path.replace(".rar", "rar")
        os.mkdir(rar_name + "_程序自动解压文件夹")
        rf = rarfile.RarFile(path)  # 待解压文件
        rf.extractall(rar_name + "_程序自动解压文件夹")  # 解压指定文件路径
        xiugai_path1 = path.replace("\\", "_").replace(":", "_")
        os.rename(path, path1 + "\\" + xiugai_path1)
        shutil.move(path1 + "\\" + xiugai_path1, zip_pathname)
        print("  正常解压,并移动", zip_pathname)
    except BaseException as e:
        print(e)


def zip(path, zip_pathname, path1):
    """
    解压zip压缩文件函数、方法。因为解压乱码的问题,修改了zipfile文件(网上的其他方法亲测不管用)
    :param path:
    :param path1:
    :return:
    """
    global zip_file
    zipname = path.replace(".zip", "zip")
    try:
        os.mkdir(zipname + "_程序自动解压文件夹")
    except:
        os.mkdir(zipname + "_程序自动解压文件夹01")
    try:
        zip_file = zipfile.ZipFile(path)
        zip_list = zip_file.namelist()
        for f in zip_list:
            zip_file.extract(f, zipname + "_程序自动解压文件夹")
        zip_file.close()
        xiugai_path1 = path.replace("\\", "_").replace(":", "_")
        os.rename(path, path1 + "\\" + xiugai_path1)
        shutil.move(path1 + "\\" + xiugai_path1, zip_pathname)
        print("  正常解压,并移动", zip_pathname)
    except BaseException as e:
        try:
            print(e)
        except:
            print("文件内容或者文件名有不兼容的字符")
    try:
        os.rmdir(zipname + "_程序自动解压文件夹")
    except:
        pass
    try:
        zip_file.close()
    except:
        pass


def zip_7z(path, zip_pathname, path1):
    """
    解压7z压缩包文件函数
    :param path:
    :param path1:
    :return:
    """
    try:
        zipexe_path = os.getcwd() + "\\7za.exe"
        zipname = path.replace(".7z", "7z")
        os.mkdir(zipname + "_程序自动解压文件夹")
        newname = zipname + "_程序自动解压文件夹"
        cmd = zipexe_path + " x " + path + " -o" + newname + " -aoa"
        os.system(cmd)
        xiugai_path1 = path.replace("\\", "_").replace(":", "_")
        os.rename(path, path1 + "\\" + xiugai_path1)
        shutil.move(path1 + "\\" + xiugai_path1, zip_pathname)
        print("  正常解压,并移动", zip_pathname)
    except BaseException as e:
        print(e)


if __name__ == '__main__':
    print("*****************程序开始运行****************")
    print("程序会扫描您所指定的目录下所有Excel文件,对压缩包进行解压,移动出文件内含有身份证号码的Excel文件,并移出压缩包")
    root_path = input("***请输入要执行的总文件夹(类似于D:\\test\\test):")
    dirname = input("注意***请输入Excel汇总的文件夹:")
    zip_pathname = input("注意***请输入压缩包汇总的文件夹:")

    logpath1 = os.getcwd()
    try:
        os.mkdir(logpath1 + "\\log")
    except:
        pass
    now_time0 = str(datetime.datetime.now())
    now_time01 = now_time0.split(".")[0]
    now_time02 = now_time01.replace(" ", "_").replace(":", "_")
    sys.stdout = Logger(logpath1 + "\\log\\" + now_time02 + ".txt")
    print("日志存放在:", logpath1 + "\\log\\" + now_time02 + ".txt")

    list_zip_rar_7z = traversal_zip(root_path)
    x = y = z = 0
    print("目录下所有rar文件开始解压")
    for list_rar in list_zip_rar_7z[1]:
        y += 1
        print("{0}/{1}".format(y, len(list_zip_rar_7z[1])))
        rar(list_rar[1], zip_pathname, list_rar[0])

    print("目录下所有zip文件开始解压")
    for list_zip in list_zip_rar_7z[0]:
        x += 1
        print("{0}/{1}".format(x, len(list_zip_rar_7z[0])))
        zip(list_zip[1], zip_pathname, list_zip[0])
    print("目录下所有7z文件开始解压")
    for list_7z in list_zip_rar_7z[2]:
        z += 1
        print("{0}/{1}".format(z, len(list_zip_rar_7z[2])))
        zip_7z(list_7z[1], zip_pathname, list_7z[0])
    print("所有压缩包已解压至压缩包所在目录下")
    print("**************************************************")
    print("开始判断输出Excel文件")
    xlsx_file_path = traversal_xlsx(root_path)
    for i in range(len(xlsx_file_path[0])):
        xlsx_nameid(xlsx_file_path[0][i], dirname, xlsx_file_path[1][i])
    print("程序运行结束,请右上角直接关闭程序")
    print("或者等待十分钟后会自动关闭程序")
    time.sleep(600)

欢迎指正,共同进步!
如果有问题,请及时告知,会在第一时间给出解释,并更改有问题的部分。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,607评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,239评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,960评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,750评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,764评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,604评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,347评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,253评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,702评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,893评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,015评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,734评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,352评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,934评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,052评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,216评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,969评论 2 355

推荐阅读更多精彩内容