【发布时间】:2018-10-05 15:33:47
【问题描述】:
如何在工作簿的所有工作表中搜索字符串/模式并返回工作簿的所有匹配工作表编号?
我可以逐个遍历 Excel 工作簿中的所有工作表,并在每个工作表中搜索字符串(如线性搜索),但效率低且需要很长时间,而且我必须处理数百个工作簿或更多。
更新 1: 示例代码
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
def searchSheets(fnames):
#Search Logic here
#Loop over each Sheet
#Search for string 'Balance' in each Sheet
#Return matching Sheet Number
if __name__ == '__main__':
__spec__ = None
folder = "C://AB//"
if os.path.exists(folder):
files = glob.glob(folder + "*.xlsx")
#Multi threading
pool = Pool()
pool=ThreadPool(processes=10)
#Suggested by @Dan D
pool.map(searchSheets,files) # It did not work
pool.close()
更新 2:错误
multiprocessing.pool.RemoteTraceback:
"""
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 119, in work
er
result = (True, func(*args, **kwds))
File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 44, in mapst
ar
return list(map(*args))
File "C:\temp3.py", line 36, in searchSheet
wb = xl_wb(f)
File "C:\ProgramData\Anaconda3\lib\site-packages\xlrd\__init__.py", line 116,
in open_workbook
with open(filename, "rb") as f:
FileNotFoundError: [Errno 2] No such file or directory: 'C'
"""
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\temp3.py", line 167, in <module>
pool.map(searchSheet,files)
File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 266, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py", line 644, in get
raise self._value
FileNotFoundError: [Errno 2] No such file or directory: 'C'
>>>
【问题讨论】:
-
也许你应该把这个问题分成几部分。你知道如何用 Python 编写代码吗?你知道excel文档结构吗?效率低吗?请说明您处于哪个阶段并编辑您的问题?
-
拆分听起来不错,但不知道该怎么做。我是 python 新手,但我知道如何在其中编写代码。当前的实现肯定是低效的。我已经实现了遍历工作簿每张纸的简单算法(使用 pandas 和 xlrd)。下一阶段是构建一个时间效率高的算法,但我正在寻找想法/代码来做到这一点。
-
语法和清晰度有所提高。
标签: python multithreading algorithm search processing-efficiency