【问题标题】:Efficient search algorithm in python to search strings in all sheets of an excel workbook and return matching sheet numberspython中的高效搜索算法在excel工作簿的所有工作表中搜索字符串并返回匹配的工作表编号
【发布时间】: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


【解决方案1】:

工作表中的搜索不依赖于以前的搜索,工作簿中的搜索也不依赖于以前的搜索。 这是您可以进行多线程的典型情况。

这篇文章描述了在 Python 中执行此操作的方法 How to use threading in Python?

所以在伪代码中:

  • 在每个工作簿的每张纸上进行并行搜索
  • 汇总并呈现结果。

【讨论】:

  • 感谢您的建议。让我看看。
  • 使用 Pool 和 map 进行多处理可以完成大部分工作。因为您只需定义一个打开和搜索单个工作簿的函数,然后将该函数映射到工作簿列表。
  • 示例代码在问题中更新。 @Dan D,这就是解决方案的设计方式,但是,当我执行它时,我没有看到多个线程被触发。它按照之前的方式执行,并且没有性能改进。任何建议!
  • 您的代码可能不正确 pool=ThreadPool(processes=10) pool.map(searchSheets(files),range(1,len(files))) 这不是应该做的。您必须传递一个 searchSheets 函数,该函数只接受一个文件,第二个参数不是整数表,而是文件表。您的代码现在正在对每个文件执行 1..nombre 的文件相同的搜索
  • 只需pool.map(searchSheets, files)
【解决方案2】:

解决方案

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

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2019-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多