
本人小白,学 python 一个多月,想自动化一些办公流程,所以就写了个将目录下所有 word 文件遍历,再将制定列复制到 excel 的程序。
测试优化了一个星期,然后发现了一个以我现在的了解无法解决的问题。同样是将 1300 行传送到 excel 中,我用程序跑 13 个 100 行的文件用不到 20 秒,但如果是跑一个大文件就要用 200 秒。期初我以为是 list 太大了,改成每 100 行传送一次,而不是一个大 list ,然后运行时间没有丝毫改变。。。
我觉得是 list 存取什么的问题?不太懂,所以求助啊~~~
代码如下
import os from openpyxl import Workbook from openpyxl.styles import PatternFill from docx import Document import re import time #excel part wb = Workbook() ws = wb.active fil = PatternFill(start_color='FFFF00', end_color='FFFF00',fill_type='solid') #os part dest_dir = input('请输入外部审校文件所在路径。\n>').replace("\\", "/") def copy(range): return str(t.cell(range, 2).text) def del_blank(text): return text != '' def clean_tag(text2): return re.sub('<'r'/?[a-z]{0,3}[0-9]{0,5}/?''>', '', text2) for root, dirs, files in os.walk(dest_dir): pass for name in files: t = Document(os.path.join(dest_dir, name)).tables[0] ws.append({'B': name}) ws['B' + str(ws.max_row)].fill = fil j = list(range(len(t.rows))) r1 = list(map(clean_tag, filter(del_blank,map(copy, j)))) r2 = [n for n in range(len(t.rows))] for row in zip(r2, r1): ws.append(row) wb.save(dest_dir + '/删重文件.xlsx') 1 iam36 2016-12-29 09:23:12 +08:00 应该是你用的这个库: openpyxl 的文件读写性能问题 office 的读写库很多,也有官方组件可以调用,多试两个一比对就明了了 试好回来写个报告 |
2 justou 2016-12-29 09:25:48 +08:00 这种要自己 profile 一下才知道瓶颈在哪里, 光是猜测没用 试试 cProfile, memory_profiler, 以及 line_profiler 这类工具 |
| /td> | 3 tomwen 2016-12-29 09:27:30 +08:00 >>r1 = list(map(clean_tag, filter(del_blank,map(copy, j)))) 改成 filterd = filter(del_blank,map(copy, j)) r1 = list(map(clean_tag, flilterd)) 试试 |
4 Tifosi OP |
7 18600491593 2016-12-29 10:58:54 +08:00 via Android 什么不用.net 毕竟都是自家人 |
8 tairan2006 2016-12-29 14:07:01 +08:00 Python 处理数据最好用`Pandas`和`Numpy`,这两个是历尽考验的大数据库 |
9 264768502 2016-12-30 09:55:19 +08:00 r1 = list(map(clean_tag, filter(del_blank,map(copy, j)))) r2 = [n for n in range(len(t.rows))] 试试看把这个 r1 和 r2 拆成多个生成器表达式 还有,多次用同一个正则的话,最好预编译好,再调用,不要直接用 re.sub 通过 Profile,如果发现瓶颈在 copy(range)的话,那就要考虑换一个 docx 的解析库了,就如楼上所说 |
10 Tifosi OP 问题解决了,时间都消耗在从 word 取出文本放在数列了 for cell in t.columns[2].cells: j.append(re.sub('<'r'/?[a-z]{0,3}[0-9]{0,5}/?''>', '', cell.text)) 改成这句之后速度提高了 20 倍 |