python中的高效搜索算法,用于在excel工作簿的所有工作表中搜索字符串并返回匹配的工作表编号
如何在工作簿的所有工作表中搜索字符串/模式,并返回工作簿的所有匹配工作表编号 我可以逐个遍历Excel工作簿中的所有工作表,并在每个工作表中搜索字符串(类似于线性搜索),但效率低下且耗时较长,我必须处理数百本或更多的工作簿 更新1:示例代码python中的高效搜索算法,用于在excel工作簿的所有工作表中搜索字符串并返回匹配的工作表编号,python,multithreading,algorithm,search,processing-efficiency,Python,Multithreading,Algorithm,Search,Processing Efficiency,如何在工作簿的所有工作表中搜索字符串/模式,并返回工作簿的所有匹配工作表编号 我可以逐个遍历Excel工作簿中的所有工作表,并在每个工作表中搜索字符串(类似于线性搜索),但效率低下且耗时较长,我必须处理数百本或更多的工作簿 更新1:示例代码 from multiprocessing import Pool from multiprocessing.dummy import Pool as ThreadPool def searchSheets(fnames): #Search Logi
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'
>>>
multiprocessing.pool.RemoteTraceback:
"""
回溯(最近一次呼叫最后一次):
文件“C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py”,第119行,正在工作中
呃
结果=(True,func(*args,**kwds))
文件“C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py”,第44行,在mapst中
应收账
返回列表(映射(*args))
搜索表中第36行的文件“C:\temp3.py”
wb=xl_wb(f)
文件“C:\ProgramData\Anaconda3\lib\site packages\xlrd\\uuuuu init\uuuuuu.py”,第116行,
在OpenU工作簿中
打开(文件名为“rb”)作为f:
FileNotFoundError:[Errno 2]没有这样的文件或目录:“C”
"""
上述异常是以下异常的直接原因:
回溯(最近一次呼叫最后一次):
文件“C:\temp3.py”,第167行,在
pool.map(搜索表、文件)
文件“C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py”,第266行,在映射中
返回self.\u map\u async(func、iterable、mapstar、chunksize).get()
get中第644行的文件“C:\ProgramData\Anaconda3\lib\multiprocessing\pool.py”
提升自我价值
FileNotFoundError:[Errno 2]没有这样的文件或目录:“C”
>>>
工作表中的搜索不依赖于以前的搜索,工作簿中的搜索也不依赖于以前的搜索。
这是您可以执行多线程处理的典型情况
这篇文章描述了用Python实现它的方法
所以在伪代码中:
- 并行搜索每个工作簿的每一页
- 聚集并显示结果
- 解决方案
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.map(searchSheets,[workbook for workbook in files],)
multiprocessing.freeze_support() # this line is needed on window
#only,found it in may other posts
pool.close()
#pool.join() #Removed this from code as it made all the workers to wait
也许你应该把这个问题分成几部分。你知道如何用Python编写代码吗?你知道excel文档结构吗?效率低吗?请指定您所处的阶段并编辑您的问题?拆分听起来不错,但不确定如何执行。我是python新手,但我知道如何用python编写代码。目前的实施显然效率低下。我已经实现了简单的算法(使用pandas&xlrd),它遍历工作簿的每一页。下一阶段是建立一个算法,这是时间效率,但我正在寻找的想法/代码只是为了做到这一点。改进语法和清晰度一点。谢谢你的建议。让我看一下。池和映射的多处理完成了大部分工作。因为您只需定义一个打开和搜索单个工作簿的函数,然后将该函数映射到工作簿列表上。示例代码将在问题中更新@Dan D,这就是解决方案的设计方式,然而,我并没有看到在执行它时触发多线程。它按照之前的方式执行,没有任何性能改进。任何建议!您的代码可能不正确pool=ThreadPool(processs=10)pool.map(searchSheets(文件)、range(1、len(文件))。这不是应该做的。您必须传递一个searchSheets函数,该函数只包含一个文件,第二个参数不是整数表,而是文件表。您的代码现在正在对每个文件执行1..nombre相同的搜索,只需
pool.map(searchSheets,files)
。