
【Python】Python扫描目录下所有SQL文件查找DROP TABLE语句并提取相关信息python检查文件夹下所有sql文件内容里面是否包含drop table语句如果有把涉及的表名提取出来生成一个excel文件来记录结果excel的列分别是序号、目录、文件名、“drop table 表名”所在文件的行号如果一个文件里面有多个删除的表就生成多行excel记录。代码如下importdatetimeimportosimportrefromcollectionsimportdefaultdictimportpandasaspddeffind_drop_tables_in_directory(root_dir): 扫描目录下所有SQL文件查找DROP TABLE语句并提取相关信息 resultsdefaultdict(list)patternre.compile(# r\bDROP\sTABLE\s(?:IF\sEXISTS\s)??([\w\$])?(?:\s*;|\s|\n|$),rDROP\sTABLE\s(?:IF\sEXISTS\s)?([^;]),re.IGNORECASE)fordirpath,_,filenamesinos.walk(root_dir):forfilenamein[fforfinfilenamesiff.lower().endswith(.sql)]:filepathos.path.join(dirpath,filename)try:withopen(filepath,r,encodingutf-8)asf:forline_num,lineinenumerate(f,start1):matchespattern.finditer(line)formatchinmatches:table_namematch.group(1).strip()results[filepath].append({directory:dirpath,filename:filename,# drop_stmt: fDROP TABLE {table_name},drop_stmt:f{table_name},line_number:line_num,table:table_name})exceptUnicodeDecodeError:print(f警告: 文件{filepath}编码不支持已跳过)returnresultsdefgenerate_excel_report(results,output_file): 将扫描结果生成Excel报告 all_records[]idx1forfile_resultsinresults.values():forrecordinfile_results:all_records.append({序号:idx,目录:record[directory],文件名:record[filename],drop table 表名:record[drop_stmt],行号:record[line_number]})idx1dfpd.DataFrame(all_records,columns[序号,目录,文件名,drop table 表名,行号])df.to_excel(output_file,indexFalse,engineopenpyxl)if__name____main__:date_stringdatetime.datetime.now().strftime(%Y%m%d-%H%M%S)# target_dir input(请输入要扫描的目录路径: )target_dirD:/test/20260119-tzqoutput_filetarget_dir/date_string-drop_table_reports.xlsx# if not os.exists(target_dir) or not os.path.isdir(target_dir):# print(错误: 指定的目录不存在或无效)# exit(1)scan_resultsfind_drop_tables_in_directory(target_dir)generate_excel_report(scan_results,output_file)print(f报告已生成:{output_file}, 共找到{len(scan_results)}个文件包含DROP TABLE语句)