1. 多线程实现批量 PDF 转换器工具
参考资料:
1). pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本。
2). python-docx 模块是读取和写入 word 文档的工具.
# encoding=utf-8
"""
Date:2019-07-22 11:21
User:LiYu
Email:liyu_5498@163.com
"""
import os
from io import StringIO
import threading
from docx import Document
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
def read_from_pdf(file_path):
with open(file_path, 'rb') as file:
resource_manager = PDFResourceManager()
return_str = StringIO()
lap_params = LAParams()
device = TextConverter(
resource_manager, return_str, laparams=lap_params
)
process_pdf(resource_manager, device, file)
device.close()
content = return_str.getvalue()
return_str.close()
return content
def save_text_to_word(content, file_path):
doc = Document()
for line in content.split('\n'):
paragraph = doc.add_paragraph()
paragraph.add_run(remove_control_charcters(line))
doc.save(file_path)
def remove_control_charcters(content):
return content.translate(dict.fromkeys(range(32)))
def pdf_to_word(sourceFile, targetFile):
content = read_from_pdf(sourceFile)
save_text_to_word(content, targetFile)
print('[%s]转换为[%s]成功' % (sourceFile, targetFile))
def find_source_file():
file_name_list = []
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.pdf'):
file_name_list.append(file)
return file_name_list
if __name__ == '__main__':
sourceFiles = find_source_file()
for sourceFile in sourceFiles:
targetFile = sourceFile.rstrip('.pdf') + '.docx'
t = threading.Thread(target=pdf_to_word, args=(sourceFile, targetFile))
t.start()
2. IP 地址归属地批量查询任务
注意: 使用创建子类的方式实现多线程任务
# encoding=utf-8
"""
Date:2019-07-22 13:15
User:LiYu
Email:liyu_5498@163.com
"""
import random
import threading
import time
import requests
class MyThread(threading.Thread):
def __init__(self, ip):
super(MyThread, self).__init__()
self.ip = ip
def run(self):
url = 'http://ip-api.com/json/%s' % self.ip
page_content = requests.get(url).text
import json
dict_data = json.loads(page_content)
print('%s\t%s\t%s' % (self.ip, dict_data['city'], dict_data['country']))
time.sleep(random.random())
if __name__ == '__main__':
for i in range(1, 10):
ip = '114.114.114.%s' % str(i)
t = MyThread(ip)
t.start()
3. 基于多线程的批量主机存活探测
注意: 使用实例化对象的方式实现多线程任务
项目描述: 如果要在本地网络中确定哪些地址处于活动状态或哪些计算机处于活动状态,则可以使用此脚本。我们将依次 ping 地址, 每次都要等几秒钟才能返回值。这可以在 Python中编程,在 IP 地址的地址范围内有一个 for 循环和一个 os.popen(“ping -q -c2”+ ip)。
项目瓶颈: 没有线程的解决方案效率非常低,因为脚本必须等待每次 ping。
# encoding=utf-8
"""
Date:2019-07-22 13:25
User:LiYu
Email:liyu_5498@163.com
"""
from threading import Thread
class GetHostAliveThread(Thread):
"""
创建子线程, 执行的任务:判断指定的IP是否存活
"""
def __init__(self, ip):
super(GetHostAliveThread, self).__init__()
self.ip = ip
def run(self):
import os
cmd = 'ping -c1 -w1 %s &> /dev/null' % self.ip
result = os.system(cmd)
# 返回值如果为0, 代表命令正确执行,没有报错; 如果不为0, 执行报错;
if result == 0:
print("%s主机存活" % self.ip)
if __name__ == '__main__':
print("打印172.25.254.0网段存活的主机".center(50, '*'))
for i in range(1, 255):
ip = '172.25.254.' + str(i)
thread = GetHostAliveThread(ip)
thread.start()