Python逆向微信图片缓存之.dat文件异或解密与批量转换实战指南

 更新时间:2026年11月04日 09:36:05   作者:予晚  
本文详解Python逆向微信图片缓存.dat文件的原理与实践,结合Pillow自动识别JPEG/PNG/GIF格式,实现批量解密、格式还原与命令行批量处理,感兴趣的朋友一起看看吧

1. 项目概述:从微信备份中抢救图片

如果你曾经尝试过备份微信聊天记录,或者在某些数据恢复的场景下,你大概率会在电脑上看到一个名为 WeChat Files 的文件夹。深入其中,在某个用户的 FileStorage 子目录里,你会发现大量以 .dat 为后缀的奇怪文件。这些文件,就是微信用于存储聊天中收发的图片、表情包的“加密”缓存。说“加密”可能有点抬举它了,它更像是一种简单的异或混淆,目的是防止用户直接双击查看,以保护隐私和缓存管理。但当我们真的需要从备份里找回一些珍贵的图片时,这些 .dat 文件就成了拦路虎。

这个项目的核心目标,就是利用 Python 这把瑞士军刀,破解这个简单的混淆机制,将散落在各个目录下的 .dat 图片文件,批量、准确、高效地还原成我们熟悉的 .png 或 .jpg 格式。这不仅仅是简单的文件格式转换,更是一次对微信本地数据存储逻辑的逆向工程。对于需要批量导出聊天图片做纪念、进行数据归档分析,或者单纯是好奇想研究一下的同学来说,掌握这个方法非常实用。

整个过程不依赖任何微信官方客户端,纯粹通过分析文件二进制特征和已知的密钥规律来解决问题。我会带你从原理分析开始,到核心解密算法的实现,再到构建一个健壮的批量处理脚本,最后分享一些我踩过坑才总结出来的排查技巧。即使你 Python 刚入门,跟着步骤走,也能成功运行起来。

2. 核心原理与逆向分析:.dat文件的秘密

在动手写代码之前,我们必须先搞清楚对手的底细。微信的 .dat 文件并不是标准的图片格式,而是在标准图片文件(如 JPEG、PNG)的原始字节流上,进行了一个逐字节的异或(XOR)操作。

2.1 异或加密与文件头特征

异或运算有一个非常美妙的特性: A XOR B = C ,那么 C XOR B = A 。也就是说,用同一个密钥 B 对数据 A 加密得到 C ,再用 B 对 C 解密就能还原 A 。微信采用的就是这种机制,密钥是一个固定的值。

如何确定这个密钥?答案藏在文件的开头,也就是“文件头”(File Header)。每种图片格式都有自己独特的、标志性的开头几个字节:

  • JPEG/JPG : 以 0xFF, 0xD8 开头(十六进制表示)。
  • PNG : 以 0x89, 0x50, 0x4E, 0x47 开头(对应 ASCII 字符 .PNG )。
  • GIF : 以 0x47, 0x49, 0x46 开头(对应 GIF )。

微信的 .dat 文件是这些原始字节与一个固定密钥逐字节异或后的结果。因此,如果我们能猜出密钥,然后用这个密钥去异或 .dat 文件的第一个(或前几个)字节,得到的结果应该能匹配上某种已知图片格式的文件头。

经过大量样本分析(这也是逆向工程的常规操作),发现微信图片 .dat 文件的密钥就是第一个字节 0xFF 与 .dat 文件第一个字节异或的结果。因为对于 JPEG 文件,原始第一个字节是 0xFF 。所以,通用的密钥推导公式为: key = 0xFF ^ dat_first_byte 。

注意 :这个密钥是 每个文件独立计算 的,并非全局固定。因为不同图片的 .dat 文件第一个字节不同,但计算出的密钥,用在该文件上一定能将其还原为正确的图片。

2.2 确定图片实际格式

知道了密钥,我们可以解密文件头,但还需要知道最终应该保存为什么格式。虽然通过密钥解密头几个字节可以判断原始类型(例如解密后是 0x89, 0x50... 就是 PNG),但一个更稳健的方法是: 尝试解密并读取文件结构 。

我们可以用计算出的密钥解密整个文件,然后在内存中检查解密后数据的文件头。Python 的 imghdr 或更强大的 PIL (Pillow库)的 Image.open() 方法可以自动识别字节流的格式。这样比单纯检查头几个字节更可靠,因为有些文件可能因为损坏或特殊原因头信息不标准。

2.3 目录结构与文件查找

微信的图片 .dat 文件通常存放在这样的路径下:

WeChat Files/你的微信ID/FileStorage/Image/

在 Image 目录下,会有许多以日期(如 2023-05 )命名的子文件夹,里面存放着具体的 .dat 文件,文件名通常是十六进制字符串,如 a1b2c3d4e5.dat 。

我们的脚本需要能够遍历指定根目录(如 WeChat Files ),递归地找到所有 .dat 文件,或者允许用户指定一个具体的目录进行处理。

3. 工具选型与环境准备

工欲善其事,必先利其器。这个项目对第三方库的依赖非常少,核心是二进制文件操作和图片处理。

3.1 核心库:Pillow 与 os/sys

  • Pillow (PIL Fork) : 这是 Python 事实上的图像处理标准库。我们主要用它来做两件事:
    • 从解密后的字节数据中识别图像格式。
    • 将解密后的数据保存为标准的图片文件。虽然我们可以直接将字节写入文件,但用 Pillow 验证一下可以确保解密数据的有效性。 安装命令: pip install Pillow
  • os 和 sys : Python 内置库,用于处理文件路径、遍历目录、获取命令行参数等。
  • argparse : 同样是内置库,用于构建一个用户友好的命令行界面,让用户可以方便地指定输入目录、输出目录等参数。

3.2 开发环境建议

  • Python 版本 : 推荐使用 Python 3.6 及以上版本。本项目代码完全兼容 Python 3。
  • 代码编辑器/IDE : 任何你顺手的都可以,比如 VS Code、PyCharm,甚至记事本。VS Code 配合 Python 插件体验很好。
  • 测试数据准备 : 强烈建议 在正式处理重要聊天记录前,先从一个备份中复制出几个 .dat 文件到一个单独的测试文件夹进行操作。避免因脚本 bug 导致原文件被意外修改。

4. 核心解密函数实现详解

一切准备就绪,我们来动手编写最核心的解密函数。这个函数将完成从读取 .dat 文件到输出解密后图片数据的全过程。

4.1 函数设计与参数

我们设计一个名为 decode_dat_image 的函数,它接收一个 .dat 文件的路径作为输入,返回解密后的图片二进制数据以及识别出的图片格式。

import os
def decode_dat_image(dat_file_path):
    """
    解码微信 .dat 图片文件。
    参数:
        dat_file_path (str): .dat 文件的完整路径。
    返回:
        tuple: (image_data (bytes), image_format (str))
               image_data: 解密后的图片字节数据。
               image_format: 识别出的图片格式,如 'jpeg', 'png', 'gif'。
              如果解密失败或不是图片,返回 (None, None)。
    """
    try:
        with open(dat_file_path, 'rb') as f:
            dat_data = f.read()
    except IOError:
        print(f"错误:无法读取文件 {dat_file_path}")
        return None, None
    # 检查文件是否足够大以包含文件头
    if len(dat_data) < 2:
        print(f"警告:文件 {dat_file_path} 过小,可能不是有效的图片.dat文件。")
        return None, None
    # 核心步骤1:计算异或密钥
    # 取.dat文件的第一个字节
    first_byte = dat_data[0]
    # 假设原始图片是JPEG(以0xFF开头),计算密钥
    xor_key = 0xFF ^ first_byte
    # 核心步骤2:使用密钥解密整个文件
    decoded_data = bytearray()
    for byte in dat_data:
        decoded_data.append(byte ^ xor_key)
    # 核心步骤3:识别图片格式
    # 方法:使用Pillow从字节数据中识别
    from PIL import Image
    import io
    try:
        img = Image.open(io.BytesIO(decoded_data))
        # 验证图片能正常加载
        img.verify()  # 快速验证文件完整性
        # 重新打开以供后续使用(verify()后需要重新打开)
        img = Image.open(io.BytesIO(decoded_data))
        image_format = img.format.lower()  # 获取格式,如'JPEG', 'PNG'
        return decoded_data, image_format
    except Exception as e:
        # 如果Pillow无法识别,尝试通过文件头简单判断
        # 但Pillow识别更可靠,这里只是兜底
        if decoded_data[:3] == b'GIF':
            return decoded_data, 'gif'
        elif decoded_data[:2] == b'\xff\xd8':
            return decoded_data, 'jpeg'
        elif decoded_data[:4] == b'\x89PNG':
            return decoded_data, 'png'
        else:
            print(f"警告:无法识别 {dat_file_path} 的解密后格式。")
            return None, None

代码解读与注意事项 :

  1. 异常处理 :使用 try...except 包裹文件读取和图片识别过程,确保单个文件出错不会导致整个程序崩溃。
  2. 密钥计算 : xor_key = 0xFF ^ first_byte 是核心算法。其逻辑是:我们假设原图是JPEG(头字节0xFF),那么 0xFF ^ xor_key = first_byte ,所以 xor_key = 0xFF ^ first_byte 。这个密钥对于其他格式(PNG、GIF)也同样有效,因为异或操作的对称性。
  3. 逐字节解密 :使用 bytearray 循环异或。对于大文件,这种纯Python循环可能稍慢,但对于图片文件(通常几KB到几MB)完全可接受。你也可以使用NumPy进行向量化操作来提速,但会增加依赖。
  4. 格式识别 :优先使用 PIL.Image.open() 来识别。 img.verify() 是一个轻量级的完整性检查,能快速发现数据是否根本不是有效图片。 img.format 属性会返回标准的大写格式名。
  5. 兜底判断 :如果Pillow识别失败(极少数情况),我们通过检查解密数据的前几个字节来做一个简单判断。这是一个健壮性设计。

实操心得 :在实际测试中,我发现几乎所有微信图片 .dat 文件都用上述算法成功解密。但偶尔会遇到一些文件,解密后 Pillow 无法识别,手动检查发现它可能根本不是图片,而是其他类型的文件(如缩略图缓存、错误文件等)。因此,函数返回 (None, None) 是必要的,上层调用者需要处理这种无效情况。

5. 构建批量转换脚本

有了核心解密函数,我们现在需要构建一个脚本,能够遍历目录、处理每个文件、并按照原始格式保存。

5.1 使用argparse构建命令行界面

一个好的工具应该易于使用。我们使用 argparse 让用户可以通过命令行参数指定输入和输出。

import argparse
import os
import sys
from pathlib import Path
def main():
    parser = argparse.ArgumentParser(description='批量解密微信图片.dat文件并转换为标准格式。')
    parser.add_argument('input_dir', help='包含.dat文件的输入目录路径')
    parser.add_argument('-o', '--output_dir', default='decoded_images',
                        help='输出目录路径(默认:./decoded_images)')
    parser.add_argument('-r', '--recursive', action='store_true',
                        help='递归遍历输入目录的子文件夹')
    parser.add_argument('-f', '--format', choices=['original', 'png', 'jpeg'],
                        default='original',
                        help='输出格式。“original”表示保持原格式(默认),“png”或“jpeg”表示统一转换。')
    args = parser.parse_args()
    input_path = Path(args.input_dir)
    output_path = Path(args.output_dir)
    # 检查输入目录是否存在
    if not input_path.exists() or not input_path.is_dir():
        print(f"错误:输入目录 '{input_path}' 不存在或不是一个目录。")
        sys.exit(1)
    # 创建输出目录(如果不存在)
    output_path.mkdir(parents=True, exist_ok=True)
    # 根据是否递归选择文件遍历方法
    if args.recursive:
        dat_files = list(input_path.rglob('*.dat'))
    else:
        dat_files = list(input_path.glob('*.dat'))
    print(f"在 '{input_path}' 中找到 {len(dat_files)} 个 .dat 文件。")
    if not dat_files:
        print("没有找到 .dat 文件,程序退出。")
        sys.exit(0)
    # 处理每个文件
    success_count = 0
    for dat_file in dat_files:
        result = process_single_file(dat_file, output_path, args.format)
        if result:
            success_count += 1
    print(f"\n处理完成!成功解密并转换 {success_count}/{len(dat_files)} 个文件。")
    print(f"输出文件保存在:{output_path.absolute()}")

5.2 单文件处理与保存逻辑

上面主函数调用的 process_single_file 函数负责协调解密和保存。

def process_single_file(dat_file_path, output_dir, output_format='original'):
    """
    处理单个.dat文件:解密、识别格式、保存。
    """
    # 1. 解密文件
    image_data, detected_format = decode_dat_image(dat_file_path)
    if image_data is None:
        print(f"[失败] 跳过 {dat_file_path.name}:无法解密或非图片文件。")
        return False
    # 2. 确定最终输出格式和文件名
    if output_format == 'original':
        final_format = detected_format  # 使用检测到的格式
        # 确保格式字符串适合用作扩展名
        if final_format == 'jpeg':
            file_ext = 'jpg'  # 通常使用.jpg扩展名
        else:
            file_ext = final_format
    else:
        final_format = output_format
        file_ext = 'png' if output_format == 'png' else 'jpg'
    # 生成输出文件名:使用原文件名(不含.dat)加上新扩展名
    stem_name = dat_file_path.stem  # 获取不带扩展名的文件名
    output_filename = f"{stem_name}.{file_ext}"
    output_file_path = output_dir / output_filename
    # 处理文件名冲突(如果已存在,添加数字后缀)
    counter = 1
    original_output_path = output_file_path
    while output_file_path.exists():
        output_filename = f"{stem_name}_{counter}.{file_ext}"
        output_file_path = output_dir / output_filename
        counter += 1
    # 3. 保存文件
    try:
        if final_format in ['jpeg', 'jpg', 'png', 'gif'] and output_format == 'original':
            # 如果是原始格式,直接写入二进制数据(最快)
            with open(output_file_path, 'wb') as f:
                f.write(image_data)
        else:
            # 如果需要格式转换(如统一转PNG),使用Pillow进行转换保存
            from PIL import Image
            import io
            img = Image.open(io.BytesIO(image_data))
            # 转换模式:如果图片是RGBA,保存为PNG可以保留透明度;否则可以转RGB
            if final_format.lower() == 'png':
                img.save(output_file_path, 'PNG')
            elif final_format.lower() in ['jpeg', 'jpg']:
                # JPEG不支持透明度,如果原图有Alpha通道,需要转换为RGB
                if img.mode in ('RGBA', 'LA', 'P'):
                    img = img.convert('RGB')
                img.save(output_file_path, 'JPEG', quality=95) # 设置JPEG质量
            else:
                # 其他格式,尝试直接保存
                img.save(output_file_path)
        print(f"[成功] {dat_file_path.name} -> {output_file_path.name} ({final_format})")
        return True
    except Exception as e:
        print(f"[错误] 保存 {output_file_path.name} 时失败:{e}")
        return False

关键点解析 :

  1. 输出格式策略 :提供了 original (保持原格式)、 png 、 jpeg 三种选项。统一转换为 PNG 或 JPEG 可以简化后续管理,但转换过程(特别是 JPEG 的有损压缩)可能导致质量损失。
  2. 文件名处理 :使用 Path.stem 获取无扩展名的原名,避免重复的 .dat 扩展名。添加了简单的冲突解决机制(添加数字后缀)。
  3. 保存优化 :如果保持原始格式,直接将解密后的字节流写入文件是最快、最无损的方式。如果需要转换格式,则必须使用 Pillow 打开图像对象再进行保存。
  4. JPEG 特殊处理 :JPEG 格式不支持透明度(Alpha通道)。如果原图是带透明度的 PNG 或 GIF,在转换为 JPEG 前,必须用 img.convert('RGB') 将其转换为 RGB 模式,否则会报错。

6. 完整脚本整合与使用示例

将上述所有函数整合到一个 .py 文件中,就得到了我们的完整工具。假设我们将其保存为 wechat_dat_decoder.py 。

使用方式 :

  • 基本用法 :处理指定目录下的所有 .dat 文件(非递归)。
  • python wechat_dat_decoder.py "D:/WeChat Files/YourWeChatID/FileStorage/Image/2024-10"
    
  • 这会将 2024-10 文件夹下的所有 .dat 文件解密,并保存到当前目录下的 decoded_images 文件夹中,保持原格式。
  • 递归处理 :处理指定目录及其所有子目录下的 .dat 文件。
  • python wechat_dat_decoder.py "D:/WeChat Files/YourWeChatID/FileStorage/Image" -r
    
  • 这会扫描整个 Image 目录。
  • 指定输出目录和格式 :将所有解密后的图片统一保存为 PNG 格式到自定义文件夹。
python wechat_dat_decoder.py "D:/dat_files" -o "D:/output_pics" -f png -r

运行脚本后,你会在终端看到类似如下的处理日志:

在 'D:\WeChat Files\...\Image\2024-10' 中找到 150 个 .dat 文件。
[成功] a1b2c3d4.dat -> a1b2c3d4.jpg (jpeg)
[成功] e5f67890.dat -> e5f67890.png (png)
[失败] 跳过 xyz12345.dat:无法解密或非图片文件。
...
处理完成!成功解密并转换 148/150 个文件。
输出文件保存在:D:\output_pics

7. 常见问题排查与实战技巧

在实际操作中,你可能会遇到一些意料之外的情况。这里分享我总结的几个常见问题和解决思路。

7.1 问题一:解密后文件损坏,无法打开

症状 :脚本显示解密成功,但生成的图片文件用任何软件都无法打开,或提示文件已损坏。

可能原因与排查 :

  1. 密钥计算错误 :这是最常见的原因。确保你的算法是 key = 0xFF ^ first_byte 。可以打印出文件的前几个字节和解密后的前几个字节看看。解密后的头两个字节应该是 FF D8 (JPEG)或 89 50 4E 47 (PNG)。
  2. 文件根本不是图片缓存 :微信的 FileStorage 目录下可能还有其他类型的 .dat 缓存文件(如视频缩略图、文件传输记录等)。这些文件可能使用了不同的加密方式,或者根本不是图片。我们的脚本通过 PIL 识别失败后会跳过它们,这是正常现象。
  3. 文件本身已损坏 :源 .dat 文件可能在传输或存储过程中损坏。

调试技巧 :可以在 decode_dat_image 函数中添加调试代码,打印可疑文件的前后字节。

# 临时调试代码
print(f"文件: {dat_file_path}")
print(f"原始头2字节: {dat_data[:2].hex()}")
print(f"计算出的密钥: {xor_key:#04x}")
print(f"解密后头2字节: {decoded_data[:2].hex()}")

7.2 问题二:处理大量文件时速度慢

症状 :当处理成千上万个文件时,脚本运行时间很长。

优化方案 :

  1. 使用 pathlib 和列表 :我们已经使用了 pathlib 的 rglob ,它比 os.walk 在某些情况下更高效。一次性获取所有文件列表再处理,逻辑清晰。
  2. 向量化异或操作(高级) :如果确实需要极致速度,可以将解密循环替换为 NumPy 的向量化操作。但这会引入 numpy 依赖。
    import numpy as np
    dat_array = np.frombuffer(dat_data, dtype=np.uint8)
    decoded_array = np.bitwise_xor(dat_array, xor_key)
    decoded_data = decoded_array.tobytes()
  3. 多进程/多线程处理 :对于 IO 密集型(主要是读文件)和 CPU 密集型(解密计算)混合的任务,使用多进程( multiprocessing 模块)可以充分利用多核CPU,显著提升速度。但实现复杂度会增加,需要考虑文件写入冲突(每个进程写入独立文件或使用队列)。

7.3 问题三:输出图片格式全部是JPEG,但有些应该是PNG

症状 :原聊天记录里发的明明是PNG表情包(带透明背景),但解密出来却是JPEG格式,背景变成了白色。

原因 :这通常是因为在保存环节,当 output_format 设置为 'original' 时,我们的格式检测可能被干扰,或者保存逻辑有误。更可能的原因是,微信存储的某些PNG文件,其 .dat 格式解密后的文件头特征与JPEG的判定逻辑发生了冲突(极罕见),或者你在代码中无意中设置了统一输出为JPEG。

解决 :

  1. 检查 decode_dat_image 函数中通过 Pillow 识别出的 detected_format 是否正确。打印出来看看。
  2. 确保 process_single_file 函数中,当 output_format='original' 时, final_format 变量确实被赋值为 detected_format 。
  3. 如果希望所有文件都保持原格式,但某些文件检测错误,可以尝试注释掉代码中通过文件头简单判断的“兜底”部分,强制依赖 Pillow 的识别结果。Pillow 的识别通常更准确。

7.4 问题四:如何只处理特定类型的图片(如只转PNG)?

需求 :有时候我们只需要找回表情包(PNG/GIF),而不需要大量的JPEG照片。

方案 :可以在 process_single_file 函数中,根据 detected_format 添加一个过滤逻辑。

# 在解密成功后,保存前添加
if final_format not in ['png', 'gif']: # 只处理PNG和GIF
    print(f"[跳过] {dat_file_path.name} 格式为 {final_format}, 不符合过滤条件。")
    return False

或者,更灵活的做法是增加一个命令行参数 --filter-format ,让用户指定需要处理的格式列表。

8. 脚本健壮性与扩展思考

一个完整的工具不仅要能跑,还要跑得稳、容易维护。

8.1 增加日志记录

将 print 语句替换为 Python 的 logging 模块,可以方便地控制日志级别(如 DEBUG, INFO, WARNING),并将日志输出到文件,便于后期排查问题。

import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# 使用时:logger.info(f"[成功] {dat_file_path.name} -> ...")

8.2 保留原始目录结构

当前脚本将所有输出文件都放在一个扁平化的输出目录里。如果希望保留微信原始的日期目录结构,可以在 process_single_file 中计算输出路径时,将输入文件相对于 input_dir 的路径也保留下来。

# 在 process_single_file 中
relative_path = dat_file_path.relative_to(input_path).parent
format_output_dir = output_dir / relative_path
format_output_dir.mkdir(parents=True, exist_ok=True)
output_file_path = format_output_dir / output_filename

这样, 2024-10 文件夹下的文件就会输出到 输出目录/2024-10/ 下。

8.3 处理其他类型的.dat文件

微信中还有 Video , File 等目录,里面可能存放着视频、文档等缓存文件。它们的加密方式 可能不同 ,不能直接套用图片的密钥算法。视频文件的 .dat 解密通常需要不同的密钥计算方式(有时与文件偏移量有关)。如果你想扩展脚本功能,需要单独分析这些文件的格式和加密规律,这属于更深入的逆向工程范畴。

这个项目从一个小小的需求点出发,串联起了文件二进制操作、异或加密原理、目录遍历、命令行工具开发、异常处理等多个 Python 核心技能点。最重要的是,它解决了实际问题。当你运行脚本,看到那些杂乱无章的 .dat 文件一个个变回熟悉的照片和表情包时,那种成就感就是编程最大的乐趣之一。希望这份详细的指南和现成的代码,能帮你顺利找回那些珍贵的数字记忆。如果在使用中遇到任何新问题,不妨回头看看“常见问题”部分,或者尝试加入一些调试打印,一步步定位问题所在。

到此这篇关于Python逆向微信图片缓存之.dat文件异或解密与批量转换实战指南的文章就介绍到这了,更多相关Python逆向微信图片缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python多进程使用及进程池详解

    Python多进程使用及进程池详解

    这篇文章主要为大家介绍了Python多进程使用及进程池详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • Python 函数那不为人知的一面

    Python 函数那不为人知的一面

    通常我们定义一个函数,然后调用该函数时,函数相关的代码才开始执行。可是很多人并不知道,当我们定义函数时,一些代码就开始执行了。今天就来说说函数这个不为人知的一面
    2021-11-11
  • OpenCV机器学习MeanShift算法笔记分享

    OpenCV机器学习MeanShift算法笔记分享

    这篇文章主要介绍了OpenCV机器学习MeanShift算法笔记分享,有需要的朋友可以借鉴参考下,希望可以对各位读者的OpenCV算法学习能够有所帮助
    2021-09-09
  • Python里字典的基本用法(包括嵌套字典)

    Python里字典的基本用法(包括嵌套字典)

    今天小编就为大家分享一篇关于Python里字典的基本用法(包括嵌套字典),小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python如何使用replace做多字符替换

    python如何使用replace做多字符替换

    这篇文章主要介绍了python如何使用replace做多字符替换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • pandas中concat函数实现横向连接

    pandas中concat函数实现横向连接

    在pandas中,concat函数可用于合并不同的Series和DataFrame对象,本文主要介绍了pandas中concat函数实现横向连接,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • 从基础到高级应用解析Python中的字典(dict)

    从基础到高级应用解析Python中的字典(dict)

    字典(Dictionary)是Python中最强大、最常用的数据结构之一,它以键值对的形式存储数据,提供了极快的查找速度,本文将全面剖析Python字典的方方面面,带您领略这个数据结构的魅力,感兴趣的可以了解下
    2026-02-02
  • Python实现的计算马氏距离算法示例

    Python实现的计算马氏距离算法示例

    这篇文章主要介绍了Python实现的计算马氏距离算法,简单说明了马氏距离算法原理,并结合实例形式分析了Python实现与使用马氏距离算法的相关操作技巧,需要的朋友可以参考下
    2018-04-04
  • python 如何把classification_report输出到csv文件

    python 如何把classification_report输出到csv文件

    这篇文章主要介绍了python 把classification_report输出到csv文件的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python实现统计英文单词个数及字符串分割代码

    Python实现统计英文单词个数及字符串分割代码

    这篇文章主要介绍了Python实现统计英文单词个数及字符串分割方法,本文分别给出代码实例,需要的朋友可以参考下
    2015-05-05

最新评论