Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的高效搜索算法,用于在excel工作簿的所有工作表中搜索字符串并返回匹配的工作表编号_Python_Multithreading_Algorithm_Search_Processing Efficiency - Fatal编程技术网

python中的高效搜索算法,用于在excel工作簿的所有工作表中搜索字符串并返回匹配的工作表编号

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

如何在工作簿的所有工作表中搜索字符串/模式,并返回工作簿的所有匹配工作表编号

我可以逐个遍历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'
>>>
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)