• [技术干货] Python爬虫:社交平台事件热度抓取与影响分析
    Python爬虫:社交平台事件热度抓取与影响分析介绍随着社交媒体的兴起,平台上的热点事件对社会、经济和政治产生了深远的影响。通过爬取社交平台的数据,我们能够获取一个事件的热度信息,并分析其在不同时间段的传播和影响力。这些数据可以被用于市场分析、品牌监测、舆情管理等场景。应用使用场景市场营销:公司可以分析某个事件或产品的曝光度和受欢迎程度。舆情分析:政府机构和企业可以监控公众对于特定话题的看法。学术研究:学者可能会分析社交媒体上信息的传播模式。危机管理:在危机时刻,及时掌握事件的动态有助于快速反应。原理解释爬虫程序通过模拟浏览器访问社交平台的网页,解析HTML内容,提取所需的数据(例如用户评论、点赞数、分享数等)。然后,这些数据将被整理和分析,以评估事件的热度和趋势。算法原理流程图┌──────────────┐ │ 开始 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 获取目标网址 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 模拟请求发送 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 解析HTML内容 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 提取数据 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 数据存储处理 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 数据分析 │ └─────┬────────┘ │ ▼ ┌──────────────┐ │ 输出结果 │ └──────────────┘算法原理解释获取目标网址:选择要爬取的社交平台页面链接。模拟请求发送:利用库如requests模拟浏览器请求,该步骤可能需要设置User-Agent头或者使用登录凭证。解析HTML内容:通过BeautifulSoup或其他解析库分析网页结构。提取数据:根据页面标签结构,提取出相关数据如评论、点赞数等。数据存储处理:将数据存入数据库或文件中以便后续分析。数据分析:应用统计方法与可视化工具(如matplotlib)对数据进行分析。输出结果:展示分析所得到的结论,如热点趋势图。实际详细应用代码示例实现import requests from bs4 import BeautifulSoup import matplotlib.pyplot as plt def fetch_page(url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } response = requests.get(url, headers=headers) return response.text def parse_page(html): soup = BeautifulSoup(html, 'html.parser') # 示例:假设我们要提取所有评论文本 comments = [comment.text for comment in soup.find_all(class_='comment')] return comments def analyze_data(comments): # 简单统计词频的例子 word_count = {} for comment in comments: words = comment.split() for word in words: word_count[word] = word_count.get(word, 0) + 1 return word_count def plot_results(word_count): words = list(word_count.keys())[:10] counts = list(word_count.values())[:10] plt.bar(words, counts) plt.xlabel('Words') plt.ylabel('Frequency') plt.title('Top 10 Frequently Used Words') plt.xticks(rotation=45) plt.show() url = 'https://www.example.com/social-media-page' html = fetch_page(url) comments = parse_page(html) word_count = analyze_data(comments) plot_results(word_count)测试代码、部署场景测试代码:确保URL有效,修改parse_page函数以适应实际的HTML结构。部署场景:定期运行脚本以捕捉实时数据变化,可以使用调度工具如cron在服务器上自动运行。材料链接BeautifulSoup DocumentationRequests Library DocumentationMatplotlib Documentation总结通过Python爬虫技术,我们可以有效地收集社交平台上的数据并进行分析。这为我们理解社交媒体上信息的传播提供了强大的工具。未来展望未来,爬虫技术可以结合机器学习进一步提高数据分析的准确性。同时,随着法律法规的完善,合规爬取数据也将更加重要。新兴的API接口可能会取代传统爬虫方式,直接提供更结构化和丰富的数据。
  • [第5期高维向量数据] 第16期问题求助
    赛题描述中提到有 "sample solution",但是附件中只有 sample_cases.zip:本地测试用例,里边似乎没有 demo 程序?
  • [技术干货] Python与OpenCV配置安装详解【CV入门级保姆教程】
    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,广泛应用于图像处理、计算机视觉和机器学习领域。Python作为一种高效的编程语言,与OpenCV的结合使得开发者能够更快速地实现视觉处理任务。本文将详细介绍如何在Python环境中配置和安装OpenCV,并提供一些代码实例帮助你快速入门。1. 安装OpenCV的步骤1.1. 环境准备在安装OpenCV之前,确保你的计算机上已经安装了Python。如果还未安装,请访问Python官网下载并安装最新版本的Python。1.2. 使用pip安装OpenCVOpenCV可以通过Python的包管理工具pip来安装。打开终端(或命令提示符),执行以下命令:pip install opencv-python这将安装OpenCV的主模块。如果你需要更多的功能,例如额外的模块或优化过的版本,可以安装opencv-python-headless(不包含GUI功能):pip install opencv-python-headless1.3. 验证安装安装完成后,可以通过Python交互式解释器(或脚本)验证OpenCV是否成功安装。运行以下代码:import cv2 print(cv2.__version__)如果正确安装,将输出OpenCV的版本号。例如,4.5.3。2. 基本的OpenCV操作实例以下是一些使用OpenCV进行基本图像处理的示例代码,包括读取、显示、保存图像和基本的图像处理操作。2.1. 读取和显示图像以下代码示例演示如何读取图像文件并显示它:import cv2 # 读取图像 image = cv2.imread('example.jpg') # 显示图像 cv2.imshow('Image', image) # 等待用户按下任意键 cv2.waitKey(0) # 关闭所有OpenCV窗口 cv2.destroyAllWindows()确保example.jpg文件存在于你的工作目录中。运行这段代码后,会弹出一个窗口显示图像,按下任意键将关闭窗口。2.2. 图像处理:转换为灰度图像将彩色图像转换为灰度图像可以通过以下代码完成:import cv2 # 读取图像 image = cv2.imread('example.jpg') # 将图像转换为灰度 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 显示灰度图像 cv2.imshow('Gray Image', gray_image) cv2.waitKey(0) cv2.destroyAllWindows()2.3. 图像处理:图像平滑使用高斯模糊进行图像平滑:import cv2 # 读取图像 image = cv2.imread('example.jpg') # 应用高斯模糊 blurred_image = cv2.GaussianBlur(image, (15, 15), 0) # 显示模糊图像 cv2.imshow('Blurred Image', blurred_image) cv2.waitKey(0) cv2.destroyAllWindows()2.4. 图像处理:边缘检测使用Canny边缘检测算法:import cv2 # 读取图像 image = cv2.imread('example.jpg') # 转换为灰度图像 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用Canny边缘检测 edges = cv2.Canny(gray_image, 100, 200) # 显示边缘图像 cv2.imshow('Edges', edges) cv2.waitKey(0) cv2.destroyAllWindows()3. 进阶配置与优化3.1. 配置OpenCV的额外功能如果需要使用OpenCV的额外功能,如深度学习模块(dnn)或高级图像处理功能,你可能需要安装带有扩展功能的OpenCV版本。可以通过源码编译的方式来实现,但这需要一定的配置和编译知识。3.2. 使用Conda进行安装如果你使用Anaconda作为Python环境管理工具,可以通过Conda来安装OpenCV:conda install -c conda-forge opencv这种方式可以确保所有依赖项都得到正确配置,尤其是在处理复杂的环境时。4. 进阶配置与优化在使用OpenCV的过程中,你可能会遇到需要优化性能或配置额外功能的场景。以下是一些进阶配置和优化的方法:4.1. 使用Conda进行安装Conda是一个流行的包管理工具,可以简化OpenCV及其依赖项的安装过程,尤其是在复杂的环境中。以下是使用Conda安装OpenCV的步骤:创建新环境(可选):conda create -n opencv_env python=3.8替换python=3.8为你需要的Python版本。激活环境:conda activate opencv_env安装OpenCV:conda install -c conda-forge opencvConda会自动处理所有依赖项和兼容性问题,使得安装过程更加顺利。4.2. 编译OpenCV源码如果你需要自定义配置或启用额外的功能,可以从源码编译OpenCV。以下是编译OpenCV的步骤:安装依赖项:在Linux系统上,你可以使用以下命令安装依赖项:sudo apt-get update sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev对于其他系统,依赖项的安装方式可能会有所不同。下载OpenCV源码:git clone https://github.com/opencv/opencv.git cd opencv创建构建目录并生成构建文件:mkdir build cd build cmake ..如果需要启用额外的功能或模块,可以在cmake命令中添加选项。例如,启用CUDA支持:cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON ..编译和安装:make -j$(nproc) sudo make install这将编译OpenCV并将其安装到/usr/local目录。4.3. 性能优化对于性能要求较高的应用,以下是一些优化建议:启用多线程和并行计算:OpenCV支持多线程和并行计算,可以通过调整编译选项或在运行时配置来优化性能。例如,启用TBB(Threading Building Blocks)可以提高并行计算性能:cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON ..利用GPU加速:OpenCV支持CUDA加速,可以显著提高图像处理性能。编译时启用CUDA支持,并使用OpenCV的CUDA模块来加速计算。注意,这需要具有NVIDIA GPU的支持。优化内存使用:在处理大图像或视频流时,优化内存使用非常重要。使用cv2.UMat代替cv2.Mat可以自动处理内存优化。示例如下:import cv2 # 读取图像到UMat image = cv2.imread('example.jpg', cv2.IMREAD_UNCHANGED) # 使用UMat进行处理 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)5. OpenCV高级功能示例5.1. 人脸检测OpenCV提供了多种预训练的模型来进行人脸检测。以下示例演示如何使用Haar级联分类器进行人脸检测:import cv2 # 加载预训练的人脸检测模型 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') # 读取图像 image = cv2.imread('example.jpg') # 转换为灰度图像 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # 绘制检测到的人脸 for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2) # 显示结果 cv2.imshow('Detected Faces', image) cv2.waitKey(0) cv2.destroyAllWindows()5.2. 使用深度学习进行对象检测OpenCV支持使用深度学习模型进行对象检测。以下示例演示如何使用YOLO模型进行对象检测:import cv2 import numpy as np # 加载YOLO模型 net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg') layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] # 读取图像 image = cv2.imread('example.jpg') height, width, channels = image.shape # 进行预处理 blob = cv2.dnn.blobFromImage(image, 0.00392, (416, 416), (0, 0, 0), True, crop=False) net.setInput(blob) outs = net.forward(output_layers) # 解析检测结果 class_ids = [] confidences = [] boxes = [] for out in outs: for detection in out: for obj in detection: scores = obj[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(obj[0] * width) center_y = int(obj[1] * height) w = int(obj[2] * width) h = int(obj[3] * height) x = int(center_x - w / 2) y = int(center_y - h / 2) boxes.append([x, y, w, h]) confidences.append(float(confidence)) class_ids.append(class_id) # 绘制检测结果 indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) for i in indices: i = i[0] box = boxes[i] x, y, w, h = box[0], box[1], box[2], box[3] cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示结果 cv2.imshow('Detected Objects', image) cv2.waitKey(0) cv2.destroyAllWindows()5.3. 图像变换与滤波OpenCV提供了丰富的图像变换和滤波函数。以下示例演示如何应用仿射变换和透视变换:import cv2 import numpy as np # 读取图像 image = cv2.imread('example.jpg') # 仿射变换 rows, cols, ch = image.shape pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) pts2 = np.float32([[10, 100], [200, 50], [100, 250]]) M = cv2.getAffineTransform(pts1, pts2) affine_image = cv2.warpAffine(image, M, (cols, rows)) # 透视变换 pts1 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) pts2 = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) M = cv2.getPerspectiveTransform(pts1, pts2) perspective_image = cv2.warpPerspective(image, M, (300, 300)) # 显示结果 cv2.imshow('Affine Transform', affine_image) cv2.imshow('Perspective Transform', perspective_image) cv2.waitKey(0) cv2.destroyAllWindows()6. 高级功能与应用场景在掌握了OpenCV的基本操作后,你可以深入探讨一些更高级的功能和应用场景。以下是一些常见的高级应用,包括视频分析、实时对象检测、图像拼接以及特征匹配。6.1. 视频分析OpenCV支持实时视频处理和分析。以下示例演示如何从摄像头捕捉视频流并进行简单的图像处理,如边缘检测:import cv2 # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取帧 ret, frame = cap.read() if not ret: break # 转换为灰度图像 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 应用Canny边缘检测 edges = cv2.Canny(gray_frame, 100, 200) # 显示处理后的帧 cv2.imshow('Edges', edges) # 按 'q' 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭所有窗口 cap.release() cv2.destroyAllWindows()在这个示例中,程序不断从摄像头捕捉帧,将其转换为灰度图像,并应用Canny边缘检测。按下 'q' 键将退出程序。6.2. 实时对象检测实时对象检测可以使用深度学习模型来识别视频流中的对象。以下示例演示如何使用YOLO模型进行实时对象检测:import cv2 import numpy as np # 加载YOLO模型 net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg') layer_names = net.getLayerNames() output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()] # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取帧 ret, frame = cap.read() if not ret: break # 进行预处理 blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False) net.setInput(blob) outs = net.forward(output_layers) # 解析检测结果 class_ids = [] confidences = [] boxes = [] height, width, channels = frame.shape for out in outs: for detection in out: for obj in detection: scores = obj[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: center_x = int(obj[0] * width) center_y = int(obj[1] * height) w = int(obj[2] * width) h = int(obj[3] * height) x = int(center_x - w / 2) y = int(center_y - h / 2) boxes.append([x, y, w, h]) confidences.append(float(confidence)) class_ids.append(class_id) # 绘制检测结果 indices = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4) for i in indices: i = i[0] box = boxes[i] x, y, w, h = box[0], box[1], box[2], box[3] cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) # 显示结果 cv2.imshow('Real-time Object Detection', frame) # 按 'q' 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头并关闭所有窗口 cap.release() cv2.destroyAllWindows()这个示例将YOLO模型应用于实时视频流,以检测和标记视频中的对象。6.3. 图像拼接图像拼接(Image Stitching)用于将多张图像合成为一张全景图像。以下示例演示如何使用OpenCV进行简单的图像拼接:import cv2 # 读取图像 images = [cv2.imread('image1.jpg'), cv2.imread('image2.jpg')] # 创建拼接器 stitcher = cv2.createStitcher() if cv2.__version__.startswith('4') else cv2.createStitcher(True) # 执行拼接 status, stitched_image = stitcher.stitch(images) if status == cv2.Stitcher_OK: # 显示结果 cv2.imshow('Stitched Image', stitched_image) cv2.waitKey(0) cv2.destroyAllWindows() else: print('Error during stitching')在此示例中,createStitcher()用于创建一个拼接器,并将图像拼接成一个全景图像。如果拼接成功,将显示结果。6.4. 特征匹配特征匹配用于比较和匹配图像中的相似特征点。以下示例演示如何使用SIFT(尺度不变特征变换)进行特征匹配:import cv2 # 读取图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 转换为灰度图像 gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 创建SIFT检测器 sift = cv2.SIFT_create() # 检测特征点和描述符 kp1, des1 = sift.detectAndCompute(gray1, None) kp2, des2 = sift.detectAndCompute(gray2, None) # 创建BFMatcher对象 bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True) # 匹配描述符 matches = bf.match(des1, des2) # 按照距离排序 matches = sorted(matches, key=lambda x: x.distance) # 绘制匹配结果 img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # 显示结果 cv2.imshow('Feature Matches', img_matches) cv2.waitKey(0) cv2.destroyAllWindows()在这个示例中,SIFT特征检测器用于检测特征点和描述符,并使用BFMatcher进行特征匹配。结果会显示前10个匹配对。7. 自定义OpenCV模块在某些情况下,你可能需要自定义OpenCV模块来满足特定需求。以下是如何创建和使用自定义模块的一些基本步骤:7.1. 创建自定义模块定义模块:创建一个Python脚本来定义你的自定义模块。例如,my_custom_module.py:import cv2 import numpy as np def custom_filter(image): # 应用自定义滤镜 kernel = np.array([[1, 1, 1], [1, -7, 1], [1, 1, 1]]) return cv2.filter2D(image, -1, kernel)使用自定义模块:在你的主脚本中导入并使用自定义模块:import cv2 from my_custom_module import custom_filter # 读取图像 image = cv2.imread('example.jpg') # 应用自定义滤镜 filtered_image = custom_filter(image) # 显示结果 cv2.imshow('Filtered Image', filtered_image) cv2.waitKey(0) cv2.destroyAllWindows()7.2. 扩展OpenCV功能如果需要将自定义算法或功能集成到OpenCV库中,可以参考OpenCV的开发文档,了解如何编写和编译C++扩展模块。有关详细信息,请访问OpenCV官方开发文档.8. 结语通过本文的介绍,你已经掌握了Python与OpenCV的安装配置、基本和高级功能的使用方法。OpenCV的强大功能不仅限于基本的图像处理,还可以扩展到实时视频分析、复杂的图像拼接和特征匹配等应用场景。随着你的深入学习和实践,你将能够利用OpenCV实现更复杂和具有挑战性的计算机视觉任务。
  • [专题汇总] 你想知道的这里都有,10月份干货合集,速进
     大家好,四季度的第一个干货合集来了,这次带来的东西主要涉及到golang,python,MySQL,redis,PostgreSQL,docker,minio,鸿蒙等等,希望可以帮助到到家 1. golang gin ShouldBind的介绍和使用示例详解【转载】 https://bbs.huaweicloud.com/forum/thread-02127165743740541019-1-1.html  2.golang flag介绍和使用示例【转载】 https://bbs.huaweicloud.com/forum/thread-0205165743832841012-1-1.html  3.Go语言中的格式化输出占位符的用法详解【转】 https://bbs.huaweicloud.com/forum/thread-0242165743874465013-1-1.html  4.Python中格式化字符串的方法总结【转载】 https://bbs.huaweicloud.com/forum/thread-02107165744051753023-1-1.html  5.Python使用进程池并发执行SQL语句的操作代码【转载】 https://bbs.huaweicloud.com/forum/thread-02111165744119162009-1-1.html  6.Mysql转PostgreSQL注意事项及说明【转】 https://bbs.huaweicloud.com/forum/thread-0205165745689855016-1-1.html  7.一文彻底讲清该如何处理mysql的死锁问题【转载】 https://bbs.huaweicloud.com/forum/thread-02111165745597896010-1-1.html  8.Redis实现分布式事务的示例【转载】 https://bbs.huaweicloud.com/forum/thread-0242165745553696016-1-1.html  9.MySQL服务无法启动且服务没有报告任何错误解决办法【转载】 https://bbs.huaweicloud.com/forum/thread-02127165745354539021-1-1.html      10.Python+OpenCV实现火焰检测【转载】 https://bbs.huaweicloud.com/forum/thread-0205165744941700014-1-1.html  11.Python Word实现批量替换文本并生成副本【转载】 https://bbs.huaweicloud.com/forum/thread-02127165744886949020-1-1.html  12.Python实现OFD文件转PDF【转载】 https://bbs.huaweicloud.com/forum/thread-0286165744755315017-1-1.html  13.Python中将文件从一个服务器复制到另一个服务器的4种方法【转】 https://bbs.huaweicloud.com/forum/thread-0242165744680560015-1-1.html  14.Python实现将pdf文档保存成图片格式【转载】 https://bbs.huaweicloud.com/forum/thread-0242165744483484014-1-1.html  15.Python通过keyboard库实现模拟和监听键盘【转载】 https://bbs.huaweicloud.com/forum/thread-0205165744195219013-1-1.html  16.docker 配置国内镜像源 https://bbs.huaweicloud.com/forum/thread-0286165634815059009-1-1.html  17.Typora 代码块Mac风格化 https://bbs.huaweicloud.com/forum/thread-02111165634917052004-1-1.html  18.MinIO上传和下载文件及文件完整性校验 https://bbs.huaweicloud.com/forum/thread-0286165634713872008-1-1.html  19.鸿蒙系统特性 https://bbs.huaweicloud.com/forum/thread-02127165634384647014-1-1.html  20.Java EasyExcel 导出报内存溢出如何解决 https://bbs.huaweicloud.com/forum/thread-02111165634289077003-1-1.html 
  • [技术干货] Python+OpenCV实现火焰检测【转载】
    项目解释此 Python 代码是使用 OpenCV、线程、声音和电子邮件功能的火灾探测系统的简单示例。以下是它的功能的简单描述:1.导入库:代码首先导入必要的库: cv2:用于图像和视频处理,特别是用于检测火灾。 threading:用于同时运行代码的某些部分(在后台)。 playsound:用于播放报警声音。 smtplib:用于发送电子邮件。2.加载训练模型:代码加载预训练的机器学习模型(XML 文件),该模型可以检测图像中的火灾。3.设置视频源:设置视频输入源,可以是笔记本电脑内置摄像头,也可以是外接USB 摄像头。该代码当前配置为从名为“fire2.mp4”的文件中读取视频。4.播放报警声音:定义播放报警声音的函数。该函数在后台运行(线程)并播放名为“fire_alarm.mp3”的警报声音文件。5.发送电子邮件:send_mail_function()定义了另一个函数来发送电子邮件。它使用 Gmail 的 SMTP 服务器向指定收件人发送有关火灾检测的警告电子邮件。代码中需要提供发件人的电子邮件和密码。6.主循环:主循环处理视频的每一帧。它执行以下操作:将帧转换为灰度以便于处理。使用加载的模型检测框架中的火灾。如果检测到火灾,它会用蓝色矩形突出显示该区域。如果第一次检测到火灾(由 控制runOnce),则会触发警报声并使用线程发送电子邮件。警报和电子邮件功能在后台运行。一旦警报和电子邮件被触发一次,系统就不会为后续发生火灾的帧重复此过程。7.显示视频:代码显示处理后的帧,并在检测到的火灾周围绘制矩形。视频将一直显示,直到您按“q”键。 import cv2 import threading import playsound import smtplib  # 加载训练好的 XML 文件 fire_cascade = cv2.CascadeClassifier('fire_detection_cascade_model.xml')  # 初始化摄像头 vid = cv2.VideoCapture(0)  # 使用笔记本内置摄像头,索引为 0 runOnce = False  # 创建布尔变量  # 定义播放警报声音的函数 def play_alarm_sound_function():     playsound.playsound('fire_alarm.mp3', True)     print("Fire alarm end")  # 定义发送邮件的函数 def send_mail_function():     recipientmail = "add recipients mail"     recipientmail = recipientmail.lower()      try:         server = smtplib.SMTP('smtp.gmail.com', 587)         server.ehlo()         server.starttls()         server.login("add senders mail", 'add senders password')         server.sendmail('add senders mail', recipientmail, "Warning: Fire accident has been reported")         print("Alert mail sent successfully to {}".format(recipientmail))         server.close()     except Exception as e:         print(e)  while True:     Alarm_Status = False     ret, frame = vid.read()      if not ret:         print("Failed to grab frame")         break      gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)     fire = fire_cascade.detectMultiScale(gray, 1.2, 5)      # 增加调试输出     print(f"Detected fire regions: {len(fire)}")      # 绘制火焰矩形框     for (x, y, w, h) in fire:         cv2.rectangle(frame, (x-20, y-20), (x+w+20, y+h+20), (0, 255, 0), 2)         roi_gray = gray[y:y+h, x:x+w]         roi_color = frame[y:y+h, x:x+w]          print("Fire alarm initiated")         threading.Thread(target=play_alarm_sound_function).start()          if not runOnce:             print("Mail send initiated")             threading.Thread(target=send_mail_function).start()             runOnce = True         else:             print("Mail is already sent once")      cv2.imshow('frame', frame)      if cv2.waitKey(1) & 0xFF == ord('q'):         break  # 释放资源 vid.release() cv2.destroyAllWindows() 
  • [技术干货] Python Word实现批量替换文本并生成副本【转载】
    任务背景为提高办公效率,用python试手了一个word任务,要求如下:给你一个基础word文档A,格式为docx,名字为:A.docx。A文档中有表格和文字,要求是将里面的字符串"完成绘画"分别替换成完成制作款式x和复习制作款式x,输出相应副本,命名为对应序号增序文档,如:1、A.docx, 2、A.docx。要求是输出1000份这样的增序文档。编码思路从问题中可提炼以下实现思路:初始化,输入目标目录、文件命名格式、待替换源字符串、目标字符串支持文档段落和表格内容查找,支持文本替换文本增序和命名增序处理代码实现文件名:doc_copy_replace.py代码如下: # -*- coding: utf-8 -*- # -*- coding: utf-8 -*- """ Created on Tue Oct 29 22:20:16 2024 @author: 来知晓 """  from docx import Document  def read_ducment(old, new, document):     # 遍历文档     for paragraph in document.paragraphs:         for run in paragraph.runs:             #替换功能             if old in run.text:                 run.text=run.text.replace(old,new)       # 遍历表格     for table in document.tables:         for row in table.rows:             for cell in row.cells:                 #遍历表格段落内容,回到上个步骤,将cell当作paragraph处理                 for paragraph in cell.paragraphs:                     for run in paragraph.runs:                         #替换功能                         if old in cell.text:                             run.text=run.text.replace(old,new)  # doc_path = r'D:\iocode\来知晓\tmp\A.docx' # doc_new_path = r'D:\iocode\来知晓\tmp\new.docx' # str_src = '完成绘画' # str_tar_odd = '完成制作款式' # str_tar_even = '复习制作款式'  # # 单样例测试 # document = Document(doc_path) # read_ducment(str_src, str_tar, document) # document.save(doc_new_path)  # 正式demo cnt = 1000 doc_new_dir = r'D:\iocode\来知晓\tmp' doc_path_origin = r'D:\iocode\来知晓\tmp\A.docx' str_src = '完成绘画' str_tar_odd = '完成制作款式' str_tar_even = '复习制作款式'  cnt_d2 = cnt // 2 str_split = '\\'  for i in range(cnt_d2):     k = i + 1     str_file_name = r'、A.docx'     doc_new_path_odd = doc_new_dir  + str_split + str(2*k-1) + str_file_name     str_tar_odd_conca = str_tar_odd + str(k)     document_odd = Document(doc_path_origin)     read_ducment(str_src, str_tar_odd_conca, document_odd)     document_odd.save(doc_new_path_odd)          doc_new_path_even = doc_new_dir + str_split + str(2*k) + str_file_name     str_tar_even_conca = str_tar_even + str(k)     document_even = Document(doc_path_origin)     read_ducment(str_src, str_tar_even_conca, document_even)     document_even.save(doc_new_path_even) 
  • [技术干货] Python实现OFD文件转PDF【转载】
    OFD 文件介绍OFD 文件是由中国国家标准化管理委员会制定的国家标准,是一种开放式文档格式,具有高度可扩展性和可编辑性,可包含多种类型内容数字化时代,电子发票已成为商务交易的常态。然而,对于许多用户来说,电子发票可能仍然是一个令人困惑的主题。特别是当涉及到OFD格式时,许多人可能不理解为什么它如此重要。在本文中,我们将探讨电子发票的OFD格式的重要性,以及为什么您应该了解并熟悉这种格式。首先,让我们解释一下什么是OFD格式。OFD,全称是“开放式文件格式”,是中国自主研发的一种电子文件格式。由于其开放性和高效性,OFD格式被广泛用于电子发票等场景。那么,为什么电子发票需要采用OFD格式呢?首先,OFD格式具有高度的可验证性。这意味着它可以轻松地验证电子发票的真实性和完整性,从而避免了假发票的风险。此外,OFD格式还有助于提高电子发票的处理效率。无论是打印、存储还是传输,OFD格式都能提供更高的效率和可靠性。对于需要报销或归档电子发票的用户来说,OFD格式的重要性不言而喻。报销是许多公司和个人经常面临的一项任务,而电子发票可以大大简化这一过程。然而,为了确保电子发票能够被接受和认可,必须采用符合规定的格式。OFD格式恰好满足了这一需求,因此成为电子发票报销和归档的首选格式。但是OFD文件格式并不能很顺畅的在普通阅读软件里使用,在代码中也不便于处理,于是我们需要将OFD格式的文件转成PDF。转换代码123456789101112131415161718192021222324252627282930import base64import osimport sysfrom easyofd.ofd import OFDfrom reportlab.pdfbase import pdfmetricsfrom reportlab.pdfbase.ttfonts import TTFontpdfmetrics.registerFont(TTFont('宋体', '方正书宋简体.ttf'))def cvt_ofd(file_path):    file_prefix = os.path.splitext(os.path.split(file_path)[1])[0]    with open(file_path, "rb") as f:        ofdb64 = str(base64.b64encode(f.read()), "utf-8")    ofd = OFD()    ofd.read(ofdb64, save_xml=True, xml_name=f"{file_prefix}_xml")    pdf_bytes = ofd.to_pdf()  # 转pdf    img_np = ofd.to_jpg()  # 转图片    ofd.del_data()    with open(f"{file_prefix}.pdf", "wb") as f:        f.write(pdf_bytes)    for idx, img in enumerate(img_np):        img.save(f"{file_prefix}_{idx}.jpg")if __name__ == "__main__":    cvt_ofd("example.ofd")安装所需依赖1pip install easyofd reportlab常见问题1.字体不存在从免费字体库下载所需要的字体文件,参考使用 pdfmetrics.registerFont(TTFont('宋体', '方正书宋简体.ttf'))注册对应的字体文件到指定的名字即可2.转换的PDF文件丢失图片通过pip安装的easyofd包可能不是最新版的源码,需要修改一下,easyofd/draw/draw_pdf.py文件当中,SupportImgType的值,将IPEG改为JPEG即可。
  • [技术干货] Python中将文件从一个服务器复制到另一个服务器的4种方法【转】
    在 Python 中,将文件从一个服务器复制到另一个服务器通常涉及到网络传输。这个过程可以通过多种方式实现,这里分享4种常用的方法。1. 使用 scp 命令scp 是一个基于 SSH 协议的文件复制工具,你可以在 Python 中使用 subprocess 模块来调用它。这种方法要求两个服务器之间可以建立 SSH 连接。1234567891011121314151617import subprocess# 定义源文件路径和目标路径source_file = '/path/to/source/file.txt'destination_file = 'user@destination_server:/path/to/destination/file.txt'# 构建 scp 命令scp_command = f'scp {source_file} {destination_file}'# 调用 scp 命令result = subprocess.run(scp_command, shell=True)# 检查命令执行结果if result.returncode == 0:    print('File transfer successful')else:    print('File transfer failed')2. 使用 paramiko 库paramiko 是一个 Python 实现的 SSHv2 协议库,可以用来执行 SSH 命令、上传和下载文件。123456789101112131415161718192021222324import paramiko# 设置 SSH 连接参数hostname = 'destination_server'port = 22username = 'user'password = 'password'source_file = '/path/to/source/file.txt'destination_file = '/path/to/destination/file.txt'# 创建 SSH 客户端client = paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPolicy())client.connect(hostname, port, username, password)# 创建 SFTP 客户端sftp = client.open_sftp()sftp.put(source_file, destination_file)# 关闭连接sftp.close()client.close()print('File transfer successful')3. 使用 rsync 命令rsync 是一个快速、多功能的文件复制工具。它可以通过 SSH 协议在服务器之间同步文件。1234567891011121314151617import subprocess# 定义源文件路径和目标路径source_file = '/path/to/source/file.txt'destination_file = 'user@destination_server:/path/to/destination/file.txt'# 构建 rsync 命令rsync_command = f'rsync -avz {source_file} {destination_file}'# 调用 rsync 命令result = subprocess.run(rsync_command, shell=True)# 检查命令执行结果if result.returncode == 0:    print('File transfer successful')else:    print('File transfer failed')4. 使用 FTP/SFTP 客户端库如果你的服务器支持 FTP 或 SFTP,你可以使用如 ftplib 或 pysftp 这样的 Python 库来上传和下载文件。1234567891011121314from pysftp import Connection# 设置 FTP/SFTP 连接参数hostname = 'destination_server'username = 'user'password = 'password'remote_path = '/path/to/destination/'local_path = '/path/to/source/file.txt'# 建立 SFTP 连接with Connection(hostname, username=username, password=password) as sftp:    sftp.put(local_path, remote_path)print('File transfer successful')5.注意事项确保在进行文件传输之前,你有足够的权限在源服务器上读取文件和在目标服务器上写入文件。保护好你的凭据,不要在代码中硬编码密码,可以使用环境变量或配置文件来管理敏感信息。考虑到网络安全,确保使用加密的传输方式,如 SSH 或 SFTP。根据你的网络环境和服务器配置,可能需要安装相应的软件包或库。
  • [技术干货] Python实现将pdf文档保存成图片格式【转载】
    有时候我们会碰到只支持图片上传的场景,如何编程快速将pdf转成图片呢?可以使用 Python 的 pdf2image 库仅10行代码就能将 PDF 文档保存为图片格式。如果 PDF 文档包含多页,则每一页可以保存为单独的图片。以下是实现该功能的步骤:步骤:安装所需的库:可以使用以下命令来安装:pdf2image: 用于将 PDF 转换为图片。poppler-utils(非 Python 包,需要系统安装):用于支持 PDF 的渲染,pdf2image 依赖它。1pip install pdf2imagePoppler 安装(根据系统不同):在 Windows 上,你可以下载 Poppler for Windows 并将其路径添加到系统环境变量中。在 Linux 上,通常可以通过包管理器安装:1sudo apt-get install poppler-utilsPython 代码:下面的代码示例可以将多页的 PDF 保存为多张图片,每页生成一个独立的 PNG 文件。1234567891011121314from pdf2image import convert_from_path# PDF 文件路径pdf_path = 'your_pdf_file_path.pdf'# 将 PDF 转换为图片images = convert_from_path(pdf_path, dpi=150)# 保存每一页为单独的图片for i, image in enumerate(images):    output_path = f'page_{i + 1}.png'    image.save(output_path, 'PNG')    print(f'Saved: {output_path}')代码解析:from pdf2image import convert_from_path:从 pdf2image 库中导入 convert_from_path 函数,用于将 PDF 文件转换为图片。images = convert_from_path(pdf_path, dpi=150):将 PDF 文件转换为图片对象列表。dpi 参数用于设置图片的质量(DPI 越高,质量越好)。每一页的图片都会被存储在 images 列表中。for i, image in enumerate(images):遍历 images 列表,逐页保存。使用 image.save(output_path, 'PNG') 保存每页为 PNG 格式。文件名由 output_path 指定,例如 page_1.png,page_2.png 等。示例输出:如果 PDF 文档有 5 页,代码会生成 5 张图片:page_1.pngpage_2.pngpage_3.pngpage_4.pngpage_5.png这样可以实现将 PDF 中的每一页保存为单独的图片,非常适合需要将 PDF 分割成多张图片的场景。如上轻松生成了我想要的图片,把convert_pdf_to_image.py文件保留下来,这样就多了一个可以把pdf转成图片的工具了,编程就是如此快乐~常见错误1:ImportError1ImportError: cannot import name 'convert_from_path' from partially initialized module 'pdf2image' (most likely due to a circular import) (C:\workspace\python\pdf2image\pdf2image.py)这个错误通常是因为文件命名冲突引起的。如果你的脚本或者工作目录中有文件名叫 pdf2image.py,它会导致 Python 误认为你在导入的模块是你自己的文件,而不是实际的库模块。为了解决这个问题,可以按以下步骤进行修复:解决步骤:重命名本地文件:确保你没有将你的脚本或工作目录中的任何文件命名为 pdf2image.py。比如,将你的文件重命名为 convert_pdf_to_image.py 或者其他不包含 pdf2image 的名字。检查.pyc 文件:重命名后,也需要删除由 Python 生成的编译文件(.pyc 文件),这些文件可能仍在指向错误的模块版本。删除 __pycache__ 文件夹,或者直接删除目录中的 .pyc 文件。重新运行代码:重命名文件后,重新运行代码。示例:如果你的文件原名是 pdf2image.py,请将其更改为其他名字,例如 convert_pdf_images.py。删除当前目录下的 __pycache__ 文件夹:在 Windows 上,你可以手动删除文件夹。在 Linux 或 macOS 上,运行:1rm -rf __pycache__修复后的代码:确认文件重命名和缓存清除后,可以重新运行以下代码:12345678910111213from pdf2image import convert_from_path# PDF 文件路径pdf_path = 'your_pdf_file_path.pdf'# 将 PDF 转换为图片images = convert_from_path(pdf_path, dpi=150)# 保存每一页为单独的图片for i, image in enumerate(images):    output_path = f'page_{i + 1}.png'    image.save(output_path, 'PNG')    print(f'Saved: {output_path}')额外建议:如果仍然遇到问题,可以尝试创建一个全新的 Python 虚拟环境来确保没有命名冲突,方法如下:1python -m venv new_env然后激活虚拟环境,并安装依赖:1234new_env\Scripts\activate  # Windowssource new_env/bin/activate  # Linux/macOSpip install pdf2image这应该可以解决 ImportError,避免模块命名冲突的问题。常见错误2:pdf2image.exceptions.1pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?这个错误是因为 pdf2image 依赖于 Poppler,而 Poppler 没有安装或没有被正确添加到系统的 PATH 环境变量中。Poppler 是一个 PDF 渲染工具,pdf2image 使用它来处理 PDF 转换。下面是如何安装和配置 Poppler 的步骤:在不同系统上安装 Poppler1. Windows你需要下载 Poppler 的 Windows 版本并将其路径添加到系统环境变量中。下载地址:Poppler for Windows下载 ZIP 文件并解压到某个目录(例如:C:\poppler)。将解压目录的 bin 文件夹路径添加到系统的 PATH 环境变量中:按 Win + R,输入 sysdm.cpl,进入 系统属性。在 高级 选项卡中,点击 环境变量。在系统变量中找到 Path,点击 编辑。添加 Poppler 的 bin 文件夹路径(例如:C:\poppler\bin)。验证 Poppler 是否安装成功:打开命令提示符,输入以下命令:1pdfinfo如果成功安装,你会看到 pdfinfo 的相关信息输出。2. Linux大多数 Linux 发行版可以通过包管理器安装 Poppler:1sudo apt-get install poppler-utils或者在基于 Fedora 的系统上:1sudo dnf install poppler-utils3. macOS你可以使用 Homebrew 来安装 Poppler:添加 Poppler 到 PATH如果在安装之后还是遇到错误,需要确保 Poppler 的可执行文件在系统的 PATH 环境变量中,具体步骤如下:在 Windows 上,确保 Poppler 安装目录的 bin 文件夹路径(如 C:\poppler\bin)已添加到环境变量中。在 Linux/macOS 上,安装时通常会自动添加到 PATH 中。验证安装在终端中运行以下命令,确保 Poppler 工具可以被找到:1pdfinfo --version如果 Poppler 安装正确并且在 PATH 中,你将看到 Poppler 的版本信息。
  • [技术干货] Python通过keyboard库实现模拟和监听键盘【转载】
    keyboard介绍如果我们想要通过快捷键,来调用某段代码,我们可以使用python的keyboard库,这个库可以用于发送,挂钩,以及模拟键盘事件等,并且同时支持多种操作系统(但是需要注意的是,在某些系统中,需要以管理员的权限运行才可以使用)当我们使用这个库的时候,可以:监听键盘事件:监听全局键盘事件,包括捕获特定键的按下或释放,记录所有键盘输入(这个功能可能很危险,需要小心使用)。模拟按键输入:模拟按键事件,如按下,释放,或者同时按下多个键等。热键和快捷键:可以设置热键或快捷键,来执行特定的回调函数。安装keyboard库,同样需要使用pip:pip install keyboardkeyboard使用监听所有键盘输入123456789import keyboard  def log_keystroke(event):    print(f"Key {event.name} {'被按下' if event.event_type == 'down' else '被释放'}")  keyboard.hook(log_keystroke)  # 使用esc键来停止监听keyboard.wait("esc")可以看到,现在我们所有的按键都会被清清楚楚的记录下来监听并回放键盘输入这个功能允许我们先输入内容,然后将所有的输入内容全部记录下来,然后再需要的时候,重新回放(也就是再模拟输入一次)123456789101112131415161718192021222324import keyboardimport time  # 记录按键keyboard.start_recording()  # 设置记录10秒的键盘输入time.sleep(10)  events = keyboard.stop_recording()  # 回放记录的按键keyboard.play(events)监听特定键的按下和释放import keyboard  def on_press_reaction(event):    if event.name == "b":        print("你为什么要按b?")    keyboard.on_press(on_press_reaction)  keyboard.wait("esc")监听按键按下:keyboard.on_press()监听按键释放:keyboard.on_release()设置热键123456789import keyboard  def print_message():    print("你为什么要召唤我?")  # 设置热键,例如alt+bkeyboard.add_hotkey("alt+b", print_message)  keyboard.wait("esc")添加热键:keyboard.add_hotkey()清除所有的热键:keyboard.clear_all_hotkeys()阻止程序直到按键:keyboard.wait("esc")模拟输入模拟文字输入:keyboard.write()模拟按键按下:keyboard.press()模拟按键释放:keyboard.release()模拟按键按下并释放:keyboard.send()
  • [技术干货] Python使用进程池并发执行SQL语句的操作代码【转载】
    这段代码使用了 Python 的 multiprocessing 模块来实现真正的并行处理,绕过 Python 的全局解释器锁(GIL)限制,从而在多核 CPU 上并发执行多个 SQL 语句。from pyhive import hive import multiprocessing   # 建立连接 conn = hive.Connection(host="localhost", port=10000, username="your_username", password="your_password")   # SQL 语句列表 sql_statements = [     "INSERT INTO table1 VALUES (1, 'value1')",     "INSERT INTO table1 VALUES (2, 'value2')",     "INSERT INTO table1 VALUES (3, 'value3')" ]   # 定义执行函数 def execute_sql(sql):     with conn.cursor() as cursor:         cursor.execute(sql)   # 确保多进程代码只在主进程中执行 if __name__ == '__main__':       # 使用进程池并发执行     with multiprocessing.Pool() as pool:         pool.map(execute_sql, sql_statements)       # 关闭连接     conn.close()1. 导入模块12from pyhive import hiveimport multiprocessingpyhive: 这是用于连接和操作 Hive 数据库的 Python 库。hive.Connection 用于建立与 Hive 数据库的连接。multiprocessing: 这是 Python 的标准库,用于创建和管理进程。通过 multiprocessing,我们可以绕过 Python 的 GIL(全局解释器锁)限制,实现真正的并行处理。2. 建立数据库连接1conn = hive.Connection(host="localhost", port=10000, username="your_username", password="your_password")这里我们使用 hive.Connection 建立一个到 Hive 数据库的连接。参数:host: HiveServer2 的主机地址,通常是 localhost 或 HiveServer2 运行的服务器 IP。port: HiveServer2 的端口号,默认是 10000。username: 连接 Hive 使用的用户名。password: 连接 Hive 使用的密码。这个连接对象 conn 将在后续的代码中用于创建游标(cursor),并通过游标执行 SQL 语句。3. 定义 SQL 语句列表12345sql_statements = [    "INSERT INTO table1 VALUES (1, 'value1')",    "INSERT INTO table1 VALUES (2, 'value2')",    "INSERT INTO table1 VALUES (3, 'value3')"]这里定义了一个包含多个 SQL 语句的列表 sql_statements。每个语句都是一个插入操作,将数据插入到 Hive 表 table1 中。你可以根据实际需求修改这些 SQL 语句。4. 定义执行函数123def execute_sql(sql):    with conn.cursor() as cursor:        cursor.execute(sql)execute_sql 函数是用于执行单个 SQL 语句的函数。with conn.cursor() as cursor:为当前数据库连接创建一个游标对象 cursor,这个游标用于执行 SQL 语句。cursor.execute(sql):执行传入的 SQL 语句。这个函数会被进程池中的每个进程调用,每个进程都会独立执行一个 SQL 语句。5. 使用进程池并发执行12with multiprocessing.Pool() as pool:    pool.map(execute_sql, sql_statements)multiprocessing.Pool():创建一个进程池。进程池可以管理一组工作进程,并将任务分配给这些进程。默认情况下,Pool() 会根据系统的 CPU 核心数创建相应数量的工作进程。你可以通过参数指定池中的进程数量,例如 Pool(4) 表示创建 4 个工作进程。pool.map(execute_sql, sql_statements):pool.map 方法会将 execute_sql 函数应用到 sql_statements 列表中的每个元素上。pool.map 方法会自动将 SQL 语句列表分配给进程池中的工作进程,每个进程独立执行一个 SQL 语句。这个过程是并行的,多个进程可以同时执行不同的 SQL 语句,从而提高执行效率。6. 关闭数据库连接1conn.close()在所有 SQL 语句执行完毕后,我们关闭数据库连接,释放资源。进程池的工作原理multiprocessing.Pool 提供了一种方便的方式来并行化执行函数。其工作原理如下:创建进程池:当你创建一个 Pool 对象时,会启动多个工作进程(数量可以指定,或默认根据 CPU 核心数决定)。任务分配:当你调用 pool.map 时,进程池会将任务(在这里是 execute_sql 函数)分配给空闲的工作进程。并行执行:每个工作进程独立执行分配给它的任务,互不干扰。结果收集:pool.map 会收集所有工作进程的执行结果,并按照原始任务列表的顺序返回结果。为什么使用进程池而不是线程池?GIL 限制:Python 的全局解释器锁(GIL)限制了多线程的并行执行能力,尤其是在 CPU 密集型任务中,多线程并不能充分利用多核 CPU。进程并行:multiprocessing 模块通过创建多个进程来绕过 GIL 限制,每个进程都有自己的 Python 解释器和内存空间,因此可以实现真正的并行执行。适用场景:线程池:适合 I/O 密集型任务(例如,等待数据库查询结果)。进程池:适合 CPU 密集型任务(例如,并行计算、数据处理等),或者你需要绕过 GIL 限制时。
  • [技术干货] Python中格式化字符串的方法总结【转载】
    字符串格式化字符串格式化是一项常见且重要的操作,用于动态生成包含变量内容的字符串。关于字符串的格式化,在python的历史上,曾经存在多种格式化字符串的方式,因此,这可能带来困扰,一些人可能不清楚应该使用哪一种格式化方法,下面,我就进行一下详细的介绍。当前推荐做法:f-string毫无疑问,f-string是现在最适合的字符串格式化的方法,因此首先进行介绍。f-string最早引入自3.6,因此需要3.6以后版本的python可以使用。使用方法: 在字符串前加上 f 或 F,并在花括号 {} 内填入变量或者表达式。12345name = "sagegrass"age = 18greeting = f"你好,我的名字是{name},我今年{age}岁,我去年{age - 1}岁"  print(greeting)在python3.8以后,加入了f-string调试支持,使用方法为在变量或者表达式以后添加=,从而同时输出名称和结果。12name = "sagegrass"print(f"{name=}") # 此时输出结果为name=sagegrass历史做法%格式化历史做法是在以前版本的python中非常常见的做法,你可以在很多较早期的代码中看见,并且,时至今日也并非完全没有使用价值,一些人可能现在仍然这样做(但最好应该改为使用f-string)。%格式化是python中最早的字符串格式化方法,已经有几十年的历史了,最早从c语言中继承过来的。使用方法: "格式字符串" % 值12345name = "sagegrass"age = 18greeting = "你好,我的名字是%s,我今年%d岁,我去年%d岁" % (name, age, age - 1)  print(greeting)其中,%s用于字符串,%d用于整型,另外还有一个常用的是%f,用于浮点数的格式化。但是由于其较为古老,既不好用,也容易出现问题,因此现在已经不建议使用了。format格式化format格式化是在python2.6以及3.0时期引入的,format提供了更强大和灵活的字符串格式化功能。使用方法:"格式字符串".format(值1, 值2, ...)1234567p1 = "锄禾"p2 = "当午"p3 = "汗滴"p4 = "下土"poem = "{}日{},{}禾{}".format(p1, p2, p3, p4)  print(poem)format格式化还允许提供位置参数,多次使用同一个变量。123456p1 = "一寸"p2 = "光阴"p3 = "金"poem = "{0}{1}{0}{2},寸{2}难买寸{1}".format(p1, p2, p3)  print(poem)format格式化还允许提供关键字参数,根据指定参数名使用。12345name = "sagegrass"age = 18greeting = "你好,我的名字是{name},我今年{age}岁,我去年{age_of_last_year}岁".format(name=name, age=age, age_of_last_year=age - 1)  print(greeting)与%格式化字符串不同,format至今仍然是一个非常不错的选择,甚至在某些语言中,最新引入的格式化字符串的方式,就是类似format的方式。
  • [技术干货] python collections 模块中的 UserString
    Python Collections 模块中的 UserString:深入解析、用法及应用场景在Python的collections模块中,UserString是一个为字符串操作提供扩展功能的类。它并不直接存在于标准库的collections模块中,但在某些Python版本中,或者在某些特定的第三方库中,你可能会找到UserString的实现。然而,更常见的是,我们会使用collections.abc模块中的UserString抽象基类来创建自定义的字符串类。UserString的定义UserString(在collections.abc中作为抽象基类存在)提供了一个字符串的接口,但将具体的字符串存储和管理留给了子类。当你创建一个UserString的子类时,你需要实现几个特殊方法,比如__getitem__、__len__等,以及一个返回内部字符串表示的__str__方法。不过,通常情况下,你会选择继承一个已经实现了这些方法的类,比如一个假设的collections.UserString(如果它存在的话,但请注意它实际上可能不存在于标准库中),或者更常见的是,你会自己实现一个基于collections.abc.UserString的类。由于collections.UserString可能不是标准库的一部分,下面我们将基于collections.abc.UserString来讨论如何创建一个自定义的字符串类。from collections.abc import UserString class MyString(UserString): def __init__(self, seq): if not isinstance(seq, (str, UserString)): raise TypeError('The input must be a string or UserString instance') self._data = seq # 使用传入的字符串或UserString实例作为内部数据 def __repr__(self): return f'{self.__class__.__name__}({self.data!r})' # UserString要求实现__str__,它返回字符串的“非正式”或可打印的表示形式 def __str__(self): return self._data # 由于UserString已经为我们实现了很多方法,我们可以选择性地重写它们 # 例如,我们可以重写lower方法来添加一些额外的功能 def lower(self): print("Converting to lowercase...") # 额外的功能,比如打印日志 return self._data.lower() # 调用内部字符串的lower方法 # 使用MyString ms = MyString("Hello, World!") print(ms) # 输出: Hello, World! print(ms.lower()) # 输出: Converting to lowercase... hello, world!注意:在上面的例子中,我们使用了self._data来存储内部字符串。这是遵循Python的命名约定,其中单下划线前缀表示“受保护的”属性,意味着它不应该被外部代码直接访问。然而,由于Python没有真正的私有属性,这个约定只是为了让代码读者明白这个属性是内部使用的。UserString的用法UserString的主要用法是创建一个自定义的字符串类,该类可以添加额外的功能、验证、日志记录等,同时仍然保持字符串的接口。由于UserString(作为具体实现)可能不是标准库的一部分,我们通常使用collections.abc.UserString作为基类,并自己实现所需的方法。UserString的使用场景自定义字符串行为:当你需要修改字符串的默认行为时,比如添加验证、日志记录、自动格式化等,UserString是一个很好的选择。数据封装:UserString可以用于封装更复杂的数据结构或逻辑,同时仍然提供字符串的接口。这可以使得你的代码更加模块化和易于维护。调试和测试:在开发和测试阶段,你可以使用UserString来创建一个字符串的“包装器”,以便在访问或修改字符串时添加额外的调试信息或断言。实现特殊功能的字符串:你可以使用UserString来创建具有特殊功能的字符串,比如限制字符集、自动加密/解密、实现模式匹配等。向后兼容性:如果你正在维护一个需要兼容不同Python版本的代码库,并且你在旧版本的Python中使用了UserString(如果它存在的话),那么你可能需要找到一个替代方案,比如使用collections.abc.UserString并自己实现所需的方法。总之,UserString(或更准确地说是collections.abc.UserString)是一个强大的工具,它允许你通过继承来扩展或修改字符串的行为。通过创建一个自定义的字符串类,你可以添加额外的功能、验证和日志记录等,同时仍然保持字符串的接口。这使得UserString成为实现复杂字符串操作、数据封装和调试的理想选择。
  • [技术干货] python collections 模块中的 UserList
    Python Collections 模块中的 UserList:定义、用法与使用场景在Python的collections模块中,UserList是一个列表的封装器,它提供了对列表对象操作的完全控制。与直接使用内置的list类型不同,UserList允许你通过继承来扩展或修改列表的行为,同时仍然保持列表的接口。这使得UserList成为实现自定义列表行为、添加额外功能或验证输入的理想选择。UserList的定义UserList的类定义位于collections.abc模块中(在Python 3中)。它是一个抽象基类,提供了列表的接口,但具体实现留给了子类。当你创建一个UserList的子类时,你需要实现几个特殊方法,比如__getitem__、__setitem__、__delitem__、__len__、insert、append、remove和pop等。然而,Python标准库中的collections.UserList(注意与collections.abc.UserList的区别,前者是具体实现,后者是抽象基类)已经为你提供了这些方法的默认实现,它基于一个内部的列表对象来存储数据。在Python 3中,推荐使用collections.abc.UserList作为创建自定义列表类的基类,并自己管理内部列表。不过,为了保持向后兼容性,这里我们还是会讨论collections.UserList(如果存在的话)。UserList的用法在Python 3中,collections.UserList可能不是直接可用的(它可能在某些Python 3的早期版本或特定发行版中不可用),但你可以通过继承collections.abc.UserList来创建一个自定义的列表类。from collections.abc import UserList class MyList(UserList): def __init__(self, initialdata=None): super().__init__() if initialdata is not None: self.data = initialdata # 使用传入的列表作为内部数据 else: self.data = [] # 可以选择性地重写其他方法,比如insert、append、remove等 # 使用MyList ml = MyList([1, 2, 3]) print(ml[0]) # 输出: 1 ml.append(4) print(ml) # 输出类似于: MyList([1, 2, 3, 4]),具体输出取决于__repr__的实现注意:在上面的例子中,由于我们重写了__init__方法,我们直接使用了self.data来存储数据。然而,在标准的UserList实现中(如果使用的是collections.UserList而不是collections.abc.UserList的自定义子类),你应该使用self.data(如果你重写了__init__)或self._data(如果你没有重写__init__并且collections.UserList提供了这样的属性)来访问内部列表。但是,由于collections.UserList可能在未来的Python版本中不再可用,因此推荐使用collections.abc.UserList并明确管理你的内部存储。UserList的使用场景自定义列表行为:当你需要修改列表的默认行为时,比如添加验证、日志记录、自动类型转换等,UserList是一个很好的选择。数据封装:UserList可以用于封装更复杂的数据结构,同时仍然提供列表的接口。这可以使得你的代码更加模块化和易于维护。调试和测试:在开发和测试阶段,你可以使用UserList来创建一个列表的“包装器”,以便在访问或修改列表时添加额外的调试信息或断言。实现特殊功能的列表:你可以使用UserList来创建具有特殊功能的列表,比如限制元素类型、自动排序元素、实现队列或栈等数据结构。向后兼容性:如果你正在维护一个需要兼容Python 2和Python 3的代码库,并且你在Python 2中使用了UserList,那么在Python 3中你可能需要找到一个替代方案,比如使用collections.abc.UserList并自己实现所需的方法。总之,UserList是一个强大的工具,它允许你通过继承来扩展或修改列表的行为。然而,由于Python标准库的不断演变,建议使用collections.abc.UserList作为创建自定义列表类的基类,并明确管理你的内部存储。这样,你的代码将更加灵活和健壮,能够适应未来Python版本的变化。
  • [技术干货] python collections 模块中的 UserDict
    Python Collections 模块中的 UserDict:定义、用法与使用场景在Python的collections模块中,UserDict是一个字典的封装器,它提供了对字典对象操作的完全控制。与直接使用内置的dict类型不同,UserDict允许你通过继承来扩展或修改字典的行为,同时仍然保持字典的接口。这使得UserDict成为实现自定义字典行为、添加额外功能或验证输入的理想选择。UserDict的定义UserDict的类定义位于collections.abc模块中(注意,在Python 3.3及更高版本中,UserDict是从collections.abc而不是直接从collections中导入的)。它是一个抽象基类,提供了字典的接口,但具体实现留给了子类。from collections.abc import UserDict当你创建一个UserDict的子类时,你需要实现几个特殊方法,比如__getitem__、__setitem__、__delitem__、__contains__、__len__以及(可选的)keys、items和values方法。然而,collections.UserDict(注意与collections.abc.UserDict的区别,前者是Python 2.x遗留的,后者是Python 3.x中的抽象基类)已经为你提供了这些方法的默认实现,它基于一个内部的字典对象来存储数据。在Python 3中,更推荐使用collections.UserDict(如果存在的话,尽管它可能在未来的版本中被弃用)或创建一个继承自collections.abc.UserDict的自定义类,并自己管理内部字典。不过,为了保持向后兼容性,这里我们主要讨论collections.UserDict(如果存在)。UserDict的用法在Python 3中,如果collections.UserDict可用(它可能在某些Python 3的早期版本或特定发行版中不可用),你可以这样使用它:from collections import UserDict # 注意:在某些Python 3版本中可能不可用 class MyDict(UserDict): def __init__(self, initialdata=None): self.data = {} # 创建一个内部字典来存储数据 if initialdata is not None: self.update(initialdata) def __getitem__(self, key): # 可以在这里添加额外的逻辑 return self.data[key] def __setitem__(self, key, value): # 可以在这里添加额外的逻辑,比如验证 self.data[key] = value # 可以选择性地重写其他方法,比如__delitem__、__contains__等 # 使用MyDict md = MyDict({'a': 1, 'b': 2}) print(md['a']) # 输出: 1 md['c'] = 3 print(md) # 输出类似于: MyDict({'a': 1, 'b': 2, 'c': 3}),具体输出取决于__repr__的实现然而,由于collections.UserDict可能在某些Python版本中不可用,更通用的方法是继承collections.abc.UserDict并自己实现必要的方法:from collections.abc import UserDict class MyDict(UserDict): def __init__(self, initialdata=None): super().__init__() if initialdata is not None: self.data = initialdata # 直接使用传入的字典作为内部数据 else: self.data = {} # 这里的self.data实际上是self._mapping,但因为我们重写了__init__,所以直接使用了self.data # 如果不重写__init__,则应该使用self._mapping来访问内部字典 # 使用MyDict(与上面相同) md = MyDict({'a': 1, 'b': 2}) print(md['a']) # 输出: 1 md['c'] = 3 print(md) # 输出将依赖于你如何实现了__repr__方法(如果没有实现,则可能不是很有用)注意:在上面的第二个例子中,由于我们重写了__init__方法,我们直接使用了self.data来存储数据。然而,在标准的UserDict实现中(如果使用的是collections.UserDict而不是collections.abc.UserDict的自定义子类),你应该使用self.data(如果你重写了__init__)或self._mapping(如果你没有重写__init__)来访问内部字典。但是,由于collections.UserDict可能在未来的Python版本中不再可用,因此推荐使用collections.abc.UserDict并明确管理你的内部存储。UserDict的使用场景自定义字典行为:当你需要修改字典的默认行为时,比如添加验证、日志记录、自动类型转换等,UserDict是一个很好的选择。数据封装:UserDict可以用于封装更复杂的数据结构,同时仍然提供字典的接口。这可以使得你的代码更加模块化和易于维护。调试和测试:在开发和测试阶段,你可以使用UserDict来创建一个字典的“包装器”,以便在访问或修改字典时添加额外的调试信息或断言。实现特殊功能的字典:你可以使用UserDict来创建具有特殊功能的字典,比如限制键的类型、自动排序键值对、实现缓存等。向后兼容性:如果你正在维护一个需要兼容Python 2和Python 3的代码库,并且你在Python 2中使用了UserDict,那么在Python 3中你可能需要找到一个替代方案,比如使用collections.abc.UserDict并自己实现所需的方法。总之,UserDict是一个强大的工具,它允许你通过继承来扩展或修改字典的行为。然而,由于Python标准库的不断演变,建议使用collections.abc.UserDict作为创建自定义字典类的基类,并明确管理你的内部存储。