Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法
在使用多线程时,为了保证数据的完整性,常常需要使用锁来对临界区进行保护。本文将提供如何使用锁在多线程中搜索txt文件的内容,并写入搜索到的内容的完整攻略。
1. 导入包
首先,我们需要导入需要用到的包:os
、threading
。
import os
import threading
2. 创建锁
接下来,我们需要创建一个锁,声明为全局变量。
lock = threading.Lock()
3. 定义线程函数
我们需要定义一个线程函数,用于搜索txt文件中的内容,并将搜索到的内容写入到指定文件中。
def search_text(file_path, content, output_file):
with open(file_path, "r") as f:
texts = f.readlines()
with lock:
with open(output_file, "a") as f:
for line in texts:
if content in line:
f.write(line)
该函数接收3个参数:
file_path
: 需要搜索的txt文件路径。content
: 搜索的内容。output_file
: 搜索结果需要写入的文件。
在函数内,我们先将txt文件的内容读入到一个列表中,然后逐行查找是否包含搜索的内容。如果搜到了,就将该行内容写入到输出文件中。需要注意的是,我们需要在写入操作前,先获取锁,以避免多线程写入冲突。
4. 定义主函数
最后,我们定义主函数,用于启动多线程。
if __name__ == '__main__':
file_path = "./data"
content = "hello world"
output_file = "./result.txt"
threads = []
for root, dirs, files in os.walk(file_path):
for file in files:
if file.endswith(".txt"):
file_full_path = os.path.join(root, file)
t = threading.Thread(target=search_text, args=(file_full_path, content, output_file))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
在主函数内,我们首先指定需要搜索的txt文件所在的目录,搜索的内容和输出结果文件。然后,我们使用os.walk
遍历目录,并筛选出txt文件进行搜索。每个搜索任务都会创建一个线程,并放到threads
列表中。最后,我们分别启动所有线程,等待所有线程执行完毕。
5. 示例说明
示例1
我们有一个txt文件data/1.txt
,内容如下:
hello world
hello python
我们需要搜索该文件中包含hello
的内容,并将结果写入result.txt
文件。代码如下:
if __name__ == '__main__':
file_path = "./data"
content = "hello"
output_file = "./result.txt"
threads = []
for root, dirs, files in os.walk(file_path):
for file in files:
if file.endswith(".txt"):
file_full_path = os.path.join(root, file)
t = threading.Thread(target=search_text, args=(file_full_path, content, output_file))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
执行后,结果文件result.txt
中将会包含如下内容:
hello world
hello python
示例2
我们有一个文件夹data
,内部含有1000个txt文件(文件名分别为1.txt, 2.txt ... 1000.txt),每个文件内部都是随机生成的1000行文本。我们需要搜索所有txt文件内包含hello
的内容,并将结果写入result.txt
文件。代码如下:
if __name__ == '__main__':
file_path = "./data"
content = "hello"
output_file = "./result.txt"
threads = []
for root, dirs, files in os.walk(file_path):
for file in files:
if file.endswith(".txt"):
file_full_path = os.path.join(root, file)
t = threading.Thread(target=search_text, args=(file_full_path, content, output_file))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
执行后,结果文件result.txt
中将会包含所有包含hello
的行。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python 多线程搜索txt文件的内容,并写入搜到的内容(Lock)方法 - Python技术站