需求:
有时候mysql某个数据表不再使用或者修改,则需要在一堆报表里(通常有几百或者上千个)找出来使用这个数据表的所有报表并进行修改,我们不可能一个个的去点开来看里面的sql有没有,可以通过python进行快速查找,节约时间。
思路
帆软报表文件通常以.cpt结尾,.frm文件不考虑。
可以通过OS包来循环查找文件夹下每一个文件,将文件名记录在list里,通过pandas包来输出到excel。
软件可以使用anaconda里的自带的VS CODE,这样就不用在本地环境下载pandas等包了,下载速度实在是太慢了。
实现
步骤1:实现循环读取文件名
实现循环读取文件的名称;
使用os.walk() 方法,详细使用见 https://www.runoob.com/python/os-walk.html;
路径要用r来标识是路径url;
```python
import os
path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
print(filepath.name.replace(path, ‘’))
- 上面的输出是 \a\b\c.cpt 这种格式的
### 步骤2:优化
- 不符合网址的左斜杠要求,而第一个字符右斜杠是不需要的,我们要去掉,改一下最后一句,在最后加上替换;
```python
.replace('\\','/')
- 把print里的数据改为一个单独的list字段,看起来清楚些;
- 利用切片功能去掉第一个字符;
```python
import os
path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’
liststring = []
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
filename = filepath.name.replace(path, ‘’).replace(‘\‘,’/‘)
liststring.append(filename[1:])
print(liststring)
- 上面的输出结果是 ['a/b/c.cpt'] 这种格式的,接下来就是存储到excel里了;
### 步骤3:存储到excel
- 利用pandas包的to_excel来输出到excel里;
- 文件路径的 **D:\files\ **可以去掉,这样就是相对路径了,文件会生成在当前目录下;
```python
import os
import pandas as pd
path = r'D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets'
findstring = 'sp_product'
liststring = []
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith('.cpt'):
filepath = open(os.path.join(root, name), 'r', encoding='utf-8')
if findstring in filepath.read():
filename = filepath.name.replace(path, '').replace('\\','/')
liststring.append(filename[1:])
#print(liststring)
df = pd.DataFrame(liststring,columns=['报表名称'])
excelname = r"D:\files\帆软报表中存在"+findstring+"数据的文件名称.xlsx"
df.to_excel(excelname,index=False)
print("输出到excel成功!")
步骤4:优化
- 实际上,没有查找到数据的话,并不需要输出excel;
- 文件名最好带上当前日期,方便识别;
- 今天查询是** datetime包的today= datetime.date.today()** ,不过要转换为字符串;
```python
import os
import pandas as pd
import datetime
path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’
liststring = []
for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
filename = filepath.name.replace(path, ‘’).replace(‘\‘,’/‘)
liststring.append(filename[1:])
#print(liststring)
if len(liststring)==0:
print(“未找到此字段!”)
else :
today= datetime.date.today()
df = pd.DataFrame(liststring,columns=[‘报表名称’])
excelname = r”D:\files\帆软报表中存在”+findstring+”数据的文件名称-“+today.strftime(‘%Y-%m-%d’)+”.xlsx”
df.to_excel(excelname,index=False)
print(“输出到excel成功!”)
### 步骤5:检测是否有bug
- 目前看来暂无bug;
- 是否有其他优化点:当然是有的,比如写成几个函数,文件路径判断,等等,这个由于是自己用的,就不用这么麻烦了。