• [专题汇总] 2025年开年的第一篇合集来了。速进
    大家好,2025年开年的第一篇合集,本次带来的是Python,Java,MySql,Golang,JSON,等等希望可以帮到大家。1.Python判断for循环最后一次的方法【转】https://bbs.huaweicloud.com/forum/thread-0248173698858425071-1-1.html2.使用Python实现高效的端口扫描器【转】https://bbs.huaweicloud.com/forum/thread-0248173699028101072-1-1.html3.使用Python实现操作mongodb详解【转】https://bbs.huaweicloud.com/forum/thread-02109173699263711070-1-1.html4.一文详解Python中数据清洗与处理的常用方法【转】https://bbs.huaweicloud.com/forum/thread-02109173699342905071-1-1.html5.Go中sync.Once源码的深度讲解【转】https://bbs.huaweicloud.com/forum/thread-0271173699402065058-1-1.html6.从源码解析golang Timer定时器体系【转】https://bbs.huaweicloud.com/forum/thread-0251173701525255062-1-1.html7.golang1.23版本之前 Timer Reset方法无法正确使用【转】https://bbs.huaweicloud.com/forum/thread-02127173701584637057-1-1.html8.Python文件读写实用方法小结【转】https://bbs.huaweicloud.com/forum/thread-02104173701685566070-1-1.html9.mysql外键创建不成功/失效如何处理【转】https://bbs.huaweicloud.com/forum/thread-02109173701958630072-1-1.html10.Redis的Zset类型及相关命令详细讲解【转】https://bbs.huaweicloud.com/forum/thread-02109173702031434073-1-1.html11.大数据小内存排序问题如何巧妙解决【转】https://bbs.huaweicloud.com/forum/thread-02127173702077058058-1-1.html12.Redis多种内存淘汰策略及配置技巧分享【转】https://bbs.huaweicloud.com/forum/thread-0272173702166312062-1-1.html13.MySQL通过binlog实现恢复数据【转】https://bbs.huaweicloud.com/forum/thread-02109173702268081074-1-1.html14.MySQL如何将一个表的字段更新到另一个表中【转】https://bbs.huaweicloud.com/forum/thread-0272173702328248063-1-1.html15.JSON字符串转成java的Map对象详细步骤【转】https://bbs.huaweicloud.com/forum/thread-02109173702572327075-1-1.html
  • [技术干货] Python文件读写实用方法小结【转】
    一、使用open函数读取文件这是Python中读取文件最基本的方式。使用open函数以只读模式(‘r’)打开文件,并指定文件编码(如’utf-8’)。然后,可以使用文件对象的read方法一次性读取整个文件内容。123with open('example.txt', 'r', encoding='utf-8') as file:    content = file.read()    print(content)二、按行读取文件对于大文件,一次性读取全部内容可能会消耗大量内存。因此,按行读取是一个更好的选择。使用for循环逐行读取文件内容,并使用strip方法去除每行末尾的换行符。123with open('example.txt', 'r', encoding='utf-8') as file:    for line in file:        print(line.strip())三、写入文件使用open函数以写入模式(‘w’)或追加模式(‘a’)打开文件。然后,可以使用文件对象的write方法将字符串写入文件。在’w’模式下,如果文件已存在,其内容会被清空;在’a’模式下,新内容会被追加到文件末尾。12345678# 写入文件with open('output.txt', 'w', encoding='utf-8') as file:    file.write('Hello, Python!\n')    file.write('Welcome to file operations.\n') # 追加内容到文件with open('output.txt', 'a', encoding='utf-8') as file:    file.write('\nGoodbye, Python!')四、使用readlines读取所有行readlines方法会读取文件中的所有行,并返回一个包含每行内容的列表。每个列表元素代表文件中的一行。1234with open('example.txt', 'r', encoding='utf-8') as file:    lines = file.readlines()    for line in lines:        print(line.strip())五、使用writelines写入多行内容writelines方法接受一个字符串列表作为参数,并将每个字符串写入文件作为一行。这对于需要一次性写入多行内容的场景非常有用。123lines_to_write = ['First line.\n', 'Second line.\n', 'Third line.\n']with open('output.txt', 'w', encoding='utf-8') as file:    file.writelines(lines_to_write)六、使用特定模块处理特定格式文件处理CSV文件:使用Python的csv模块可以方便地读写CSV文件。通过创建csv.writer对象来写入CSV文件,通过创建csv.reader对象来读取CSV文件。12345678910111213import csv # 写入CSV文件with open('data.csv', 'w', newline='', encoding='utf-8') as file:    writer = csv.writer(file)    writer.writerow(['Name', 'Age', 'City'])    writer.writerows([['Alice', 30, 'New York'], ['Bob', 25, 'Los Angeles']]) # 读取CSV文件with open('data.csv', 'r', encoding='utf-8') as file:    reader = csv.reader(file)    for row in reader:        print(row)处理JSON文件:使用Python的json模块可以方便地进行JSON数据的序列化和反序列化。通过json.dump方法将Python对象序列化为JSON格式并写入文件,通过json.load方法从文件中反序列化JSON数据。1234567891011import json # 序列化对象并写入JSON文件data = {'name': 'Alice', 'age': 30, 'city': 'New York'}with open('data.json', 'w', encoding='utf-8') as file:    json.dump(data, file, ensure_ascii=False, indent=4) # 从JSON文件中反序列化对象with open('data.json', 'r', encoding='utf-8') as file:    loaded_data = json.load(file)    print(loaded_data)
  • [技术干货] 一文详解Python中数据清洗与处理的常用方法【转】
    在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战。本文总结了多种数据清洗与处理方法:缺失值处理包括删除缺失值、固定值填充、前后向填充以及删除缺失率高的列;重复值处理通过删除或标记重复项解决数据冗余问题;异常值处理采用替换或标记方法控制数据质量;数据类型转换确保数据格式符合分析需求,例如转换为整数或日期类型;文本清洗包括去空格、字符替换及转换大小写等操作。此外,还介绍了数据分组统计、数据分箱与标准化的应用。例如,分组统计可按列求均值,数据分箱能为连续变量赋予分类标签,而归一化则通过压缩数据范围提升模型表现。这些方法能有效提高数据质量与分析效率,是数据科学中不可或缺的能。         缺失值处理删除缺失值df_dropped = df.dropna()print("\n删除缺失值后:")print(df_dropped)用固定值填充缺失值df_filled = df.fillna({    'title': 'Unknown',    'author': 'Unknown Author',    'price': df['price'].mean()})print("\n填充缺失值后:")print(df_filled)前向填充df_ffill = df.fillna(method='ffill')print("\n前向填充缺失值后:")print(df_ffill)后向填充df_bfill = df.fillna(method='bfill')print("\n后向填充缺失值后:")print(df_bfill)重复值处理删除重复值df_deduplicated = df.drop_duplicates()print("\n删除重复值后:")print(df_deduplicated)
  • [技术干货] 使用Python实现操作mongodb详解【转】
    from pymongo import MongoClientfrom urllib.parse import quoteclass test_mongo:    def __init__(self, host,port,user,pwd,db):        self.host = host        self.port = port        self.user = user        self.pwd = pwd        self.db = db    def build_conn_mongo(self):        """        功能:实现创建客户端        :return: client        """        escaped_username = quote(self.user, safe='')        escaped_password = quote(self.pwd, safe='')        # 创建客户端对象,连接MongoDB服务器        client = MongoClient('mongodb://{0}:{1}@{2}:{3}/{4}'.format(escaped_username, escaped_password, self.host, self.port, self.db))        return client    def check_mongo(self,query=None):        """        功能:查询信息        :param query:输入查询条件  eg:{"paId": "38ffefbe29ddcf3c9f574aa"}        :return:返回信息,以及获取查询的条数        """        client = self.build_conn_mongo()        db = client.iot_ota        collection = db.集合名称        results = collection.find(query)        count= collection.count_documents(query)        client.close()        return results,count    def update_mongo_by_query(self,query, set_value):        """        功能:按照条件修改一个记录        :param query:输入查询条件  eg:query1 = {"paId": "38ffefbe291a375c4aa"}        :param set_value:eg:{"$set":{"description":"yz测试"}}        :return:返回基本信息        """        client = self.build_conn_mongo()        db = client.iot_ota        collection = db.集合名称        results = collection.update_one(query, set_value)        client.close()        return results    def delete_package_by_query(self,query):        """        功能:按照条件删除一个记录        :param query:输入查询条件  eg:{"otId":202501221}        :return:        """        client = self.build_conn_mongo()        db = client.iot_ota        collection = db.集合名称        results = collection.delete_one(query)        client.close()        return results二、常用指令序号指令描述1db = client.数据库名获取数据库2db.collection.find()筛选所有记录3db.collection.find({“key”:value})按照条件进行查询记录4db.collection.count_documents(query)按照条件查询符合记录的条数5db.collection.update_one(query, set_value))更新一条记录6db.collection.delete_one(query)删除一条记录
  • [技术干货] 使用Python实现高效的端口扫描器【转】
    1. 端口扫描的基本原理端口扫描的基本原理是向目标主机的指定端口发送数据包,并监听是否有来自该端口的响应。根据响应的不同,可以判断该端口的状态(如开放、关闭或过滤)。常见的端口扫描类型包括:TCP SYN扫描:发送SYN包,如果收到SYN-ACK,则端口开放;如果收到RST,则端口关闭。TCP Connect扫描:完成三次握手,如果成功则端口开放。UDP扫描:发送UDP包,如果收到ICMP错误消息,则端口关闭;如果没有响应,则可能开放或过滤。2. 使用Python实现端口扫描2.1 安装必要的库首先,我们需要安装​​scapy​​库,这是一个强大的网络工具库,支持创建、发送、捕获和解析网络数据包。1pip install scapy2.2 编写端口扫描脚本下面是一个使用​​scapy​​实现的简单端口扫描器示例:from scapy.all import *import ipaddress def port_scan(ip, ports):    """    对指定IP地址的指定端口进行扫描    :param ip: 目标IP地址    :param ports: 需要扫描的端口号列表    :return: 打印开放的端口    """    open_ports = []    for port in ports:        # 构造SYN包        packet = IP(dst=ip)/TCP(dport=port, flags="S")        response = sr1(packet, timeout=1, verbose=0)                if response is not None and TCP in response:            if response[TCP].flags == 0x12:  # 如果收到SYN-ACK                # 发送RST包复位连接                send_rst = sr(IP(dst=ip)/TCP(dport=port, flags="R"), timeout=1, verbose=0)                open_ports.append(port)            elif response[TCP].flags == 0x14:  # 如果收到RST                pass  # 端口关闭    return open_ports if __name__ == "__main__":    target_ip = "192.168.1.1"  # 替换为目标IP    target_ports = [22, 80, 443, 8080]  # 指定需要扫描的端口    open_ports = port_scan(target_ip, target_ports)        if open_ports:        print(f"Open ports on {target_ip}: {open_ports}")    else:        print(f"No open ports found on {target_ip}")2.3 脚本解释构造SYN包:使用​​scapy​​构建一个TCP SYN包,目标是目标IP地址和指定端口。发送并接收响应:使用​​sr1​​函数发送数据包并等待响应,超时时间为1秒。分析响应:如果收到SYN-ACK响应,说明端口开放;如果收到RST响应,说明端口关闭。复位连接:对于开放的端口,发送一个RST包以复位连接,避免建立完整的TCP连接。3. 运行与测试确保你有权限发送网络数据包(通常需要root权限)。运行上述脚本后,它将输出目标主机上开放的端口列表。本文介绍了如何使用Python和​​scapy​​库实现一个简单的端口扫描器。虽然这个扫描器功能较为基础,但它提供了一个良好的起点,可以根据实际需求进一步扩展和优化。例如,可以添加多线程支持以提高扫描速度,或者实现更复杂的扫描策略来规避防火墙检测。这篇文章详细介绍了如何使用Python和​​scapy​​​库实现一个简单的端口扫描器,适合初学者学习和实践。端口扫描是网络安全领域中常用的技术之一,用于检测目标主机上开放的服务和端口。Python 提供了多种库来实现这一功能,其中 ​​socket​​ 库是最基础也是最灵活的选择之一。为了提高效率,可以使用多线程或异步 I/O 技术。下面是一个使用 ​​socket​​ 和 ​​concurrent.futures​​(多线程)实现的高效端口扫描器示例:import socketfrom concurrent.futures import ThreadPoolExecutor def scan_port(ip, port):    try:        # 创建一个 socket 对象        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:            sock.settimeout(1)  # 设置超时时间            result = sock.connect_ex((ip, port))            if result == 0:                print(f"Port {port} is open")            else:                print(f"Port {port} is closed")    except socket.error as e:        print(f"Socket error: {e}") def main():    target_ip = input("Enter the target IP address: ")    start_port = int(input("Enter the start port: "))    end_port = int(input("Enter the end port: "))     # 使用 ThreadPoolExecutor 来并行扫描多个端口    with ThreadPoolExecutor(max_workers=100) as executor:        for port in range(start_port, end_port + 1):            executor.submit(scan_port, target_ip, port) if __name__ == "__main__":    main()代码说明:​​scan_port​​​ 函数:这个函数负责检查单个端口是否开放。它创建一个 ​​socket​​ 对象,并尝试连接到指定的 IP 地址和端口。如果连接成功,则端口开放;否则,端口关闭。​​main​​​ 函数:这是程序的主入口。用户输入目标 IP 地址和要扫描的端口范围。然后使用 ​​ThreadPoolExecutor​​ 来并行执行多个 ​​scan_port​​ 任务,以提高扫描速度。​​ThreadPoolExecutor​​:这是一个多线程池,可以同时执行多个任务。这里设置的最大工作线程数为 100,可以根据实际情况调整。注意事项:性能与资源:多线程可以显著提高扫描速度,但过多的线程可能会消耗大量系统资源,甚至导致目标系统拒绝服务(DoS)。因此,需要根据实际情况调整 ​​max_workers​​ 的值。法律与道德:未经授权的端口扫描可能违反法律法规。在进行端口扫描之前,请确保你有合法的权限。
  • [技术干货] Python判断for循环最后一次的方法【转】
    1.使用enumerate()和len()来判断for循环最后一次迭代一种常见的方法是使用enumerate()函数来获取迭代的索引和值,并通过比较索引和可迭代对象的长度(如果可迭代对象支持len()函数)来判断是否是最后一次迭代。但是,请注意,并不是所有的可迭代对象都支持len()函数(比如文件对象或生成器)。下面是一个使用enumerate()和len()来判断for循环最后一次迭代的示例:# 假设我们有一个列表作为可迭代对象  iterable = [1, 2, 3, 4, 5]    # 使用enumerate()获取索引和值  for index, value in enumerate(iterable):      # 判断是否是最后一次迭代      if index == len(iterable) - 1:          print(f"这是最后一次迭代,值是:{value}")      else:          print(f"这不是最后一次迭代,值是:{value}")2.使用一个布尔标志来跟踪是否是最后一次迭代然而,如果可迭代对象不支持len()函数,我们可以使用一个布尔标志来跟踪是否是最后一次迭代。这种方法不依赖于可迭代对象的长度,因此更加通用:# 假设我们有一个不支持len()的可迭代对象,比如一个文件对象或生成器  iterable = iter([1, 2, 3, 4, 5])  # 使用iter()将列表转换为迭代器作为示例    # 初始化一个标志变量  is_last = False    # 尝试从迭代器中获取值,直到StopIteration异常被引发  try:      prev_value = next(iterable)  # 获取第一个值      for value in iterable:  # 从第二个值开始迭代          # 在这里处理非最后一次迭代的逻辑          print(f"这不是最后一次迭代,值是:{prev_value}")          prev_value = value  # 更新prev_value为当前值,用于下一次迭代            # 如果循环正常结束(没有因为break而提前结束),则prev_value是最后一个值      is_last = True  except StopIteration:      # 迭代正常结束,不需要处理异常      pass    # 在循环外部判断并处理最后一次迭代的逻辑  if is_last:      print(f"这是最后一次迭代,值是:{prev_value}")请注意,第二个示例中的方法并不总是能准确地判断最后一次迭代,特别是当for循环中包含break语句时。在实际应用中,我们通常会根据具体的需求和上下文来选择最适合的方法。除了上述提到的方法之外,确实还有其他几种方法可以在Python的for循环中判断是否是最后一次迭代,但每种方法都有其适用场景和局限性。
  • [大赛资讯] 第十九期 评分标准
    第十九期分数最高值是多少
  • [技术干货] Python库中psycopg 和 psycopg2 区别
    psycopg 和 psycopg2 都是用于Python语言连接PostgreSQL数据库的适配器,但实际上,它们之间存在一些区别和联系:版本和历史:psycopg 是指 psycopg 的最新版本,也就是 psycopg3 的简称。psycopg3 是在 psycopg2 之后推出的,它提供了新的特性和改进。psycopg2 是 psycopg 的旧版本,它是一个非常稳定和广泛使用的PostgreSQL适配器,支持Python 2和Python 3。API和用法:psycopg3 提供了一个更加现代和灵活的API,它的设计更加符合Python的编程习惯,例如使用了异步编程支持和类型注解。psycopg2 的API相对较旧,但因为它长时间被广泛使用,因此有着大量的文档和社区支持。性能:psycopg3 在设计上考虑了性能优化,并且引入了一些新的特性来提高性能,例如支持批量操作和复制。psycopg2 虽然稳定,但在某些方面可能不如 psycopg3 性能优越。兼容性:psycopg2 支持Python 2和Python 3,这对于一些老旧的项目来说是非常重要的。psycopg3 主要支持Python 3,不再支持Python 2,这意味着它是面向未来的。维护和支持:由于Python 2已经在2020年停止支持,psycopg2 的维护工作可能会逐渐减少,重点转移到 psycopg3。psycopg3 作为新版本,将获得更长时间的维护和支持。总结来说,如果你正在开始一个新的项目,或者打算升级现有项目以利用最新的特性和性能改进,那么选择 psycopg3 可能是更好的选择。如果你维护的是一个依赖Python 2或者已经使用了 psycopg2 的成熟项目,那么继续使用 psycopg2 可能更为稳妥。在做出选择时,应考虑项目的具体需求和未来发展方向。
  • [技术干货] streamlit @st.cache_data 和 @st.cache_resource 的区别
    streamlit 是一个开源的Python库,用于快速构建数据应用和机器学习模型的原型。在 streamlit 中,@st.cache_data 和 @st.cache_resource 是两种不同的装饰器,它们都用于缓存数据以提高应用的性能,但是它们的使用场景和缓存机制有所不同。以下是 @st.cache_data 和 @st.cache_resource 的主要区别:@st.cache_data目的:用于缓存函数的输出结果,尤其是那些计算成本高的数据或计算结果。存储位置:缓存的 数据存储在内存中。生命周期:当用户的会话结束时,缓存的数据会被清除。适用场景:适用于缓存轻量级的数据,如计算结果、小型数据集等。限制:不应该用于缓存大型数据集或对象,因为这可能会导致内存使用量过大。@st.cache_resource目的:用于缓存资源,如数据库连接、大型数据文件或模型对象,这些资源初始化成本高,且在应用的生命周期内不需要经常改变。存储位置:缓存的资源可以存储在磁盘上,不仅仅限于内存。生命周期:缓存的资源在应用重启之前都会保持缓存状态,不会因为用户会话结束而清除。适用场景:适用于缓存初始化成本高的资源,如数据库连接、大型文件读取、机器学习模型等。限制:由于资源缓存不会在用户会话结束时清除,因此使用时需要确保不会造成资源泄露或不必要的磁盘空间占用。使用建议当你需要缓存的数据是轻量级的,并且生命周期与用户会话相同,使用 @st.cache_data。当你需要缓存的是初始化成本高的资源,并且这些资源在应用重启前不需要改变,使用 @st.cache_resource。正确使用这些装饰器可以显著提高 streamlit 应用的性能,但也要注意不要滥用,以避免造成内存或磁盘空间的浪费。
  • [专题汇总] 2024的尾声,12月份干货合集。
     大家好,首先祝大家新年快乐,身体健康,代码没bug,投产顺利。本次整理带来的有关于mybatis,java,spring,springboot,linux,shell,Python,HarmonyOS,算法等多种类技术干货,希望可以帮到大家。  1.MyBatis 探秘之#{} 与 ${} 参传差异解码(数据库连接池筑牢数据交互根基)【转】 https://bbs.huaweicloud.com/forum/thread-0296171007849327168-1-1.html  2.scala中正则表达式的使用详解【转】 https://bbs.huaweicloud.com/forum/thread-02119171007725887139-1-1.html  3.SpringBoot实现websocket服务端及客户端的详细过程【转】 https://bbs.huaweicloud.com/forum/thread-0217171007411153148-1-1.html  4.spring 参数校验Validation示例详解【转】 https://bbs.huaweicloud.com/forum/thread-02109171007351771185-1-1.html  5.java集成kafka实例代码【转】 https://bbs.huaweicloud.com/forum/thread-02112171007196458168-1-1.html  6.SpringBoot中Get请求和POST请求接收参数示例详解【转】 https://bbs.huaweicloud.com/forum/thread-02112171007106397167-1-1.html  7.Java中StopWatch工具类的用法详解【转】 https://bbs.huaweicloud.com/forum/thread-0263171006880471176-1-1.html  8.Linux下shell基本命令之grep用法及示例小结【转】 https://bbs.huaweicloud.com/forum/thread-02119170989547937131-1-1.html  9.Python使用PIL库拼接图片的详细教程【转】 https://bbs.huaweicloud.com/forum/thread-02119170989479126130-1-1.html  10.bash shell的条件语句详解【转】 https://bbs.huaweicloud.com/forum/thread-0217170989387999141-1-1.html  11.pandas数据缺失的两种处理办法【转】 https://bbs.huaweicloud.com/forum/thread-02112170989326183158-1-1.html  12.Python使用PyQt5实现中英文切换功能【转】 https://bbs.huaweicloud.com/forum/thread-0263170989204908173-1-1.html  13.python螺旋数字矩阵的实现示例【转】 https://bbs.huaweicloud.com/forum/thread-0241170989116650156-1-1.html  14.使用Python实现文件查重功能【转】 https://bbs.huaweicloud.com/forum/thread-02109170989032191180-1-1.html  15.Linux内核验证套件(LKVS) https://bbs.huaweicloud.com/forum/thread-0217170613884758126-1-1.html  16.三大排序算法:插入排序、希尔排序、选择排序 https://bbs.huaweicloud.com/forum/thread-0263170613042983158-1-1.html  17.【Linux】多用户协作-转载 https://bbs.huaweicloud.com/forum/thread-02109170612919963145-1-1.html  18.SSH可以连接但sftp确无法链接,有可能是防火墙的问题吗-转载 https://bbs.huaweicloud.com/forum/thread-0217170612856550125-1-1.html  19.【Linux】线程同步与互斥 (生产者消费者模型-转载 https://bbs.huaweicloud.com/forum/thread-02112170612824528138-1-1.html  20.【HarmonyOS】公司鸿蒙项目收工总结之《组件》 https://bbs.huaweicloud.com/forum/thread-0263170475389496136-1-1.html  21.【HarmonyOS】高仿华为阅读翻页 https://bbs.huaweicloud.com/forum/thread-02109170473860592128-1-1.html  22.【HarmonyOS】仿iOS线性渐变实现 https://bbs.huaweicloud.com/forum/thread-0241170473759150128-1-1.html  23.【HarmonyOS】利用emitter封装工具类 https://bbs.huaweicloud.com/forum/thread-0276170473613513148-1-1.html  24.【HarmonyOS】多Toast显示工具类 https://bbs.huaweicloud.com/forum/thread-0217170472563245114-1-1.html  25.【HarmonyOS】头像裁剪圆形遮罩效果实现demo https://bbs.huaweicloud.com/forum/thread-0276170472467118147-1-1.html 
  • [技术干货] Python使用PIL库拼接图片的详细教程【转】
    1. 安装Pillow库首先,你需要确保你的Python环境中安装了Pillow库。如果还没有安装,你可以使用pip来安装:1pip install pillow2. 导入必要的模块在你的Python脚本中,你需要导入Pillow库中的Image模块。这个模块提供了处理图片所需的所有功能。1from PIL import Image3. 定义拼接函数接下来,定义一个函数来拼接两张图片。这个函数将接受两张图片和一个表示拼接方向的参数(水平或垂直)。def concatenate_images(image1, image2, orientation='horizontal'):     if orientation == 'horizontal':         # 水平拼接         new_image = Image.new('RGB', (image1.width + image2.width, image1.height))         new_image.paste(image1, (0, 0))         new_image.paste(image2, (image1.width, 0))     elif orientation == 'vertical':         # 垂直拼接         new_image = Image.new('RGB', (image1.width, image1.height + image2.height))         new_image.paste(image1, (0, 0))         new_image.paste(image2, (0, image1.height))     else:         raise ValueError('Orientation must be "horizontal" or "vertical"')     return new_image 4. 加载图片使用Image.open()方法加载你想要拼接的两张图片。确保你提供的路径是正确的,并且图片文件存在。12image1 = Image.open('path_to_image1.jpg')image2 = Image.open('path_to_image2.jpg')将'path_to_image1.jpg'和'path_to_image2.jpg'替换为你的图片文件的实际路径。5. 拼接图片调用你定义的concatenate_images()函数,传入两张图片和你想要的拼接方向(‘horizontal’或’vertical’)。1concatenated_image = concatenate_images(image1, image2, 'horizontal')  # 或者 'vertical'6. 保存新图片使用save()方法将拼接后的新图片保存到你的文件系统中。1concatenated_image.save('concatenated_image.jpg')将'concatenated_image.jpg'替换为你想要保存的文件名和格式。完整代码示例 from PIL import Image  def concatenate_images(image1, image2, orientation='horizontal'):     if orientation == 'horizontal':         # 水平拼接         new_image = Image.new('RGB', (image1.width + image2.width, image1.height))         new_image.paste(image1, (0, 0))         new_image.paste(image2, (image1.width, 0))     elif orientation == 'vertical':         # 垂直拼接         new_image = Image.new('RGB', (image1.width, image1.height + image2.height))         new_image.paste(image1, (0, 0))         new_image.paste(image2, (0, image1.height))     else:         raise ValueError('Orientation must be "horizontal" or "vertical"')     return new_image  # 加载图片 image1 = Image.open('path_to_image1.jpg') image2 = Image.open('path_to_image2.jpg')  # 拼接图片 concatenated_image = concatenate_images(image1, image2, 'horizontal')  # 或者 'vertical'  # 保存新图片 concatenated_image.save('concatenated_image.jpg') 更复杂的图片拼接当然,我们可以编写一个更复杂的图片拼接函数,该函数不仅可以处理水平和垂直拼接,还可以处理任意数量的图片,并且允许用户指定拼接图片之间的间距以及输出图片的背景颜色。以下是一个更复杂的图片拼接函数示例: from PIL import Image  def concatenate_images(images, orientation='horizontal', spacing=10, bg_color=(255, 255, 255)):     """     拼接图片的函数。      参数:     images (list of PIL.Image.Image): 要拼接的图片列表。     orientation (str): 拼接方向,'horizontal' 表示水平,'vertical' 表示垂直。     spacing (int): 图片之间的间距(像素)。     bg_color (tuple): 输出图片的背景颜色,格式为 (R, G, B)。      返回:     PIL.Image.Image: 拼接后的新图片。     """     if not images:         raise ValueError("图片列表不能为空")      if orientation == 'horizontal':         # 计算拼接后图片的宽度和高度         total_width = sum(img.width for img in images) + (len(images) - 1) * spacing         max_height = max(img.height for img in images)         new_image = Image.new('RGB', (total_width, max_height), bg_color)          # 依次粘贴图片         current_x = 0         for img in images:             new_image.paste(img, (current_x, 0))             current_x += img.width + spacing             # 最后一个图片不需要间距             if current_x == total_width:                 break             current_x -= spacing     elif orientation == 'vertical':         # 计算拼接后图片的宽度和高度         max_width = max(img.width for img in images)         total_height = sum(img.height for img in images) + (len(images) - 1) * spacing         new_image = Image.new('RGB', (max_width, total_height), bg_color)          # 依次粘贴图片         current_y = 0         for img in images:             new_image.paste(img, (0, current_y))             current_y += img.height + spacing             # 最后一个图片不需要间距             if current_y == total_height:                 break             current_y -= spacing     else:         raise ValueError('Orientation must be "horizontal" or "vertical"')      return new_image  # 使用示例 images = [Image.open('path_to_image1.jpg'), Image.open('path_to_image2.jpg'), Image.open('path_to_image3.jpg')] concatenated_image = concatenate_images(images, orientation='horizontal', spacing=20, bg_color=(255, 255, 255)) concatenated_image.save('concatenated_image.jpg') 在这个函数中:支持任意数量的图片:通过传入一个图片列表来拼接任意数量的图片。图片间距:添加了一个 spacing 参数,允许用户指定图片之间的间距。背景颜色:添加了一个 bg_color 参数,允许用户指定输出图片的背景颜色。错误处理:如果传入的图片列表为空,函数将抛出一个 ValueError。请注意,当拼接方向为水平时,计算了所有图片宽度的总和,并加上了图片之间的间距(除了最后一个图片之外)。同样地,当拼接方向为垂直时,计算了所有图片高度的总和,并加上了图片之间的间距。最后,使用 Image.new() 方法创建一个新的空白图片,并使用 paste() 方法将原始图片粘贴到新的图片上。
  • [技术干货] bash shell的条件语句详解【转】
    12~ script% touch if.sh~ script% chmod 755 if.sh1.if-then-fi1234567#!/usr/bin/env bashFOOD=$1if [ $FOOD="apple" ]then    echo The food is $FOODfiexit 012~ script % ./if.sh appleThe food is apple如果要将多条语句写在一行,可以分号分割开,如:1if [ $FOOD="apple" ];then注意:if [ 条件 ],中括号包住的条件与括号之间必须要有空格。if关键字与中括号之间也必须要有空格。为什么会这样, 因为命令与参数之间必须要用空格分开。[]中括号代表的量test这个命令,所以上面的if语句也可以写成:1234if test $FOOD="apple"then        echo The food is $FOODfi所以如果没有空格了,解析器就会找到一个错误或不存在的命令,因为它会把在每一行遇到的第一个空格前面有字符串的字符串当作是命令,之后的当作是参数。所以如果if和[]没有空格,执行脚本时就会报错,把if[ apple=apple ]都当作是命令了,而这实际上是一个不存在的命令:12~ script % ./if.sh apple./if.sh: line 4: if[ apple=apple ]: command not found温馨提示:赋值语句的等号左右不能有空格,否则会报错。2.else子句if.sh:123456789#!/usr/bin/env bashNUM=$1if [ $NUM -eq 10 ] # = 等价于-eq,后者只能用于数字的比较上,前者=,则在字符串和数字上都能用于相等的比较then        echo it is 10else        echo it is not 10fiexit 012~ script % ./if.sh 109it is not 103.elif子句123456789101112131415#!/usr/bin/env bashNUM=$1if [ $NUM -eq 10 ] # = 等于-eq,后者只能用于数字的比较上,前者则都可以用在字符串和数字的相等比较上then        echo equal 10elif [ $NUM -lt 10 ]then        echo less than 10elif [ $NUM -le 11 ]then        echo less than or equal 11else        echo greater than 11fiexit 012~ script % ./if.sh 109greater than 11-eq:equal 等于-lt:less than 小于-gt:greater than 大于-le:less than or equal 小于或等于-ge:greater than or equal 大于或等于为什么不可以用<,>等来表达上面这些关系,因为这些符号在类Unix系统中有特殊用途。
  • [技术干货] pandas数据缺失的两种处理办法【转】
    数据缺失通常有两种情况:空,None等,在pandas是NAN(和np的nan一样)另一种就是01.为NaN数据的处理1.判断这列有没有NaN12has_nan = df['age'].isnull().any()print(has_nan)或者直接在控制台根据数据进行判断处理方式1:只考虑单列1df2 = df[pd.notnull(df["original_publication_year"]) 这行代码的目的是 去除 original_publication_year 列中含有 NaN 值的行,并生成一个新的 DataFrame(df2),包含了所有 original_publication_year 列中不含 NaN 值的行。3. df["original_publication_year"] 是获取 df 数据框中的 original_publication_year 这一列。4. pd.notnull(df["original_publication_year")用于检查数据中的每个元素是否不是 NaN。返回一个布尔值的 Series.True 的行会被保留;False 的行会被排除(Book2何Book4被去除)。5. 返回一个所有 original_publication_year 列中不是NaN 的行新的DataFrame处理方式2:删除NaN所在的行1dropna(axis=0,how='any',inplace=False)any表示有就删,all表示全部是NaN才删inplace表示是否进行原地修改处理方式3:填充数据12mean_value = df["original_publication_year"].mean()  # 计算均值df_filled=df["original_publication_year"].fillna(mean_value)12345t.fillna(t.mean()) #填充均值t["列名"]=t["列名"].fillna(t["列名"].mean())#单独对某一列进行操作t.fiallna(t.median()) #填充中值t.fillna(0)2:为0数据的处理123t[t==0]=np.nan # 赋值为NaN# 当然并不是每次为0的数据都需要处理# 计算平均值等情况,nan是不参与计算的,但是0会的设置成NaN后用处理NaN的方法处理。
  • [技术干货] Python使用PyQt5实现中英文切换功能【转】
    一、UI界面多语言切换安装必要的工具和库确保你已经安装了PyQt5及其相关工具,如Qt Designer、Qt Linguist等。这些工具通常随PyQt5的安装包一起提供。设计UI界面使用Qt Designer设计你的UI界面,并保存为.ui文件。例如,可以设计一个包含按钮和标签的简单界面。将UI文件转换为Python代码使用pyuic5工具将.ui文件转换为Python代码。例如,如果你的UI文件名为main_window.ui,可以使用以下命令进行转换:pyuic5 -o main_window_ui.py main_window.ui 生成翻译文件使用pylupdate5工具生成翻译文件(.ts文件)。这个文件包含了UI界面中所有需要翻译的字符串。例如:1pylupdate5 main_window_ui.py -ts main_window_en.ts这将生成一个名为main_window_en.ts的英文翻译文件。翻译字符串使用Qt Linguist打开.ts文件,并逐条翻译其中的字符串。翻译完成后,保存并发布翻译文件,这将生成一个.qm文件,该文件是PyQt5实际使用的翻译文件。加载翻译文件在你的Python代码中,使用QTranslator类加载翻译文件,并应用到应用程序中。例如: from PyQt5.QtCore import QTranslator, QCoreApplication from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton import sys  class MainWindow(QMainWindow, Ui_MainWindow):     def __init__(self):         super(MainWindow, self).__init__()         self.setupUi(self)          # 创建QTranslator对象         self.translator = QTranslator()          # 加载翻译文件         # 注意:这里需要根据实际路径来加载.qm文件         self.translator.load(':/translations/main_window_en')  # 假设.qm文件已经被添加到资源文件中          # 安装翻译器到应用程序         QCoreApplication.installTranslator(self.translator)          # 更新UI界面的语言         self.retranslateUi(self)      def retranslateUi(self, MainWindow):         _translate = QCoreApplication.translate         MainWindow.setWindowTitle(_translate("MainWindow", "Main Window"))         # ... 其他需要翻译的字符串  if __name__ == '__main__':     app = QApplication(sys.argv)     mainWindow = MainWindow()     mainWindow.show()     sys.exit(app.exec_()) 注意:在实际应用中,你可能需要根据用户的语言选择来动态加载不同的翻译文件。实现语言切换功能你可以通过按钮或其他控件来实现语言切换功能。在切换语言时,需要卸载当前的翻译器并加载新的翻译器。例如: def switch_to_chinese(self):     # 卸载当前翻译器     QCoreApplication.removeTranslator(self.translator)      # 加载中文翻译文件     self.translator.load(':/translations/main_window_zh_CN')      # 安装新的翻译器到应用程序     QCoreApplication.installTranslator(self.translator)      # 更新UI界面的语言     self.retranslateUi(self)  def switch_to_english(self):     # 类似地,卸载当前翻译器并加载英文翻译文件     # ... 二、程序内部字符串多语言切换对于程序内部的字符串(如日志、错误信息等),你可以使用gettext等国际化工具来实现多语言切换。以下是一个简要的步骤:安装gettext你可以通过pip安装gettext库(如果尚未安装):1pip install gettext但请注意,gettext通常是GNU的一个项目,你可能需要参考其官方文档来获取更详细的信息和安装指南。提取字符串使用xgettext等工具将程序源码中的字符串提取到.po文件中。例如:1xgettext -o messages.po your_script.py --from-code utf-8翻译字符串打开.po文件,并逐条翻译其中的字符串。翻译完成后,保存文件。编译翻译文件使用msgfmt等工具将.po文件编译成.mo文件。例如:12345678910111213import gettextimport os# 设置语言环境目录locale_dir = os.path.join(os.path.dirname(__file__), 'locale')# 根据用户选择的语言加载翻译文件language = 'en'  # 或 'zh_CN' 等t = gettext.translation('messages', localedir=locale_dir, languages=[language])_ = t.gettext# 使用翻译后的字符串print(_("Hello, world!"))
  • [技术干货] python螺旋数字矩阵的实现示例【转】
    python螺旋数字矩阵给出数字个数n (0<n ≤999)和行数m (0<m ≤ 999)。从左上角的1开始,按照顺时针螺旋向内写方式,输出1-n,依次写出2,3.….,最终形成一个m行的矩阵。1.每行数字的个数一样多2.列的数量尽可能少3.填充数字时优先填充外部4.数字不够时,使用单个*号占位 def getRes(n, m):     num_size = n     rows = m      cols, _ = divmod(n, m)     cols = cols + 1 if _ else cols # 列数      res = [['*'] * cols for _ in range(rows)]  # 初始化m行的矩阵     i, j = 0, 0     directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]  # 四个方向依次为:右,下,左,上     direction_index = 0 # 表示当前走的方向,随i和j的变化而变化     for num in range(num_size):         number = num + 1         res[i][j] = str(number)  # 为了后面拼接字符串,所以转str         nxt_i, nxt_j = directions[direction_index][0] + i, directions[direction_index][1] + j  # 按照当前方向时,下一个坐标位置         if not (0 <= nxt_i < rows and 0 <= nxt_j < cols and res[nxt_i][nxt_j] == '*'):# 表示走的方向的改变。当下一个坐标位置出了边界时,或者未到边界但是下一个位置的值不是*,也就是已被填充时,改变方向             direction_index = (direction_index + 1) % 4         i, j = i + directions[direction_index][0], j + directions[direction_index][1]     for values in res:         print('\t'.join(values))  getRes(9, 4)