Python 多线程(针对磁盘IO效率的改进)

本文介绍了如何在Python中使用多线程进行文件操作,包括写入不同文件、使用`ThreadPoolExecutor`进行并发处理,以及通过解压zip文件提取特定HTML文件的内容。同时展示了如何使用正则表达式从提取的数据中获取特定信息。
摘要由CSDN通过智能技术生成
# encoding=utf-8
import sys
import time
from concurrent.futures import ThreadPoolExecutor


def llog_print_yzy(*msg):
    # llog_print_yzy('fa啊发', 3, sys._getframe().f_lineno)  # call
    # 最后一个参数是 日志打印的行号
    last_index = len(msg) - 1
    msg_str = ''

    for i in range(last_index):
        '''
        定义函数不确定有多少参数时,可用*来表示多个参数
          连接字符串的方式,可以让print的输出之间 去掉空格。
          把'类型'放'值'前面,是因为可以对齐,否则用\t都不齐
          不想要各个参数的打印,直接把下面这行打印去掉就好了:
        '''
        # print('params', i + 1, '----------- [类型]:', type(msg[i]), ',-----------[值]:', str(msg[i]))

        msg_str += str(msg[i])
        if i != last_index - 1:
            msg_str += ', '
    print('[Line]: ' + str(msg[last_index]), ', [message]: ', msg_str, end='\n\n')


# llog_print_yzy('fa啊发', 3, sys._getframe().f_lineno)


def print_nums(n):
    # 写入不同的文件,应该就不会发生冲突
    with open(r'D:\T\Documents\MobileFile\桌面\python学习\main_7\\' + str(n) + '.txt', 'w+') as file:
        file.write(
            'xxx另外还有mode属性:看查文件对象的模式、closed属性:判断文件是否关闭、name属性:返回文件名这里我还要介绍一个关键字with,他是一个表达式能为调用的文件对象别名,且自动关闭文件。xxxx另外还有mode属性:看查文件对象的模式、closed属性:判断文件是否关闭、name属性:返回文件名这里我还要介绍一个关键字with,他是一个表达式能为调用的文件对象别名,且自动关闭文件。xxx')
        file.write(str(n))
        file.write(str(n))
        file.write(str(n))
        file.write(str(n))
        file.write(str(n))
        file.write(
            'xxx另外还有mode属性:看查文件对象的模式、closed属性:判断文件是否关闭、name属性:返回文件名这里我还要介绍一个关键字with,他是一个表达式能为调用的文件对象别名,且自动关闭文件。xxx')
    print(n)


''' 单线程 '''
# start_time = time.time()
# for n in range(1, 30000 + 1):
#     # range(1, 11)     # 从 1 开始到 10
#     print_nums(n)
# end_time = time.time()
#
# cost_time = '%.2f' % (end_time - start_time)
# llog_print_yzy(cost_time + 's', sys._getframe().f_lineno)

# ====================================
''' 多线程 '''
# list_items = []
# for n in range(1, 30000 + 1):
#     # range(1, 11)     # 从 1 开始到 10
#     list_items.append(n)
#
# start_time = time.time()
#
# with ThreadPoolExecutor() as pool:
#     # 函数名,准备好的参数列表
#     pool.map(print_nums, list_items)
#
# end_time = time.time()
# cost_time = '%.2f' % (end_time - start_time)
# llog_print_yzy(cost_time + 's', sys._getframe().f_lineno)


# ========================================
''' 实现不解压 就提取文件:敢想,然后网上搜索 '''
import zipfile, os, re

file_path = r'D:\T\Documents\MobileFile\桌面\python学习\main_7'
file_list = os.listdir(file_path)  # get 当前目录下的所有 文件名字和文件夹的名字。没有递归

# 得到当前目录下所有的zip文件
new_list = []
for i in file_list:
    if re.findall(r'.*\.zip', i):
        new_list.append(i)

for i in new_list:
    # 更具体的zip_path
    zip_path = "D:\T\Documents\MobileFile\桌面\python学习\main_7\\" + i
    f = zipfile.ZipFile(zip_path, "r")

    inner_html_name = ''
    for f_name in f.namelist():  # f.namelist() 会返回压缩包内所有文件名的列表。
        if '.html' in f_name:
            inner_html_name = f_name
            break

    innet_data = f.read(inner_html_name)  # 因为很确定只有一个html
    llog_print_yzy(i, innet_data, sys._getframe().f_lineno)

    # 因为innet_data 是一个byte类型,转换了一下str,才能使用正则
    re_result = re.findall('layer_id:(\d)+', str(innet_data))
    llog_print_yzy(re_result, sys._getframe().f_lineno)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值