用 Python 生成文件清单:大小、SHA-256 与错误记录

举报
yd_210400787 发表于 2026/10/29 16:03:27 2026/10/29
【摘要】 提供一个只读的 Python 文件清单脚本:递归记录相对路径、字节数和 SHA-256,跳过符号链接,并把读取错误写入 CSV,便于交付和归档核对。

用 Python 生成文件清单:大小、哈希与错误记录

整理项目交付物或归档目录时,只看文件名往往不够:同名文件可能内容不同,复制过程也可能漏文件。一个包含相对路径、字节数和 SHA-256 的 CSV 清单,可以帮助我们核对目录内容。下面的脚本只读取文件并写出清单,不会修改源目录。

实现思路

  1. 递归遍历指定目录,只处理普通文件;符号链接单独跳过,避免意外走出目标目录或形成循环。
  2. 分块读取文件计算 SHA-256,避免把大文件一次性加载到内存。
  3. 每处理一个文件就写一行 CSV。读取失败时记录错误,整批任务继续运行。
  4. 把清单输出到扫描目录之外,避免脚本把自己生成的 CSV 也扫进去。

完整脚本

from pathlib import Path
import argparse
import csv
import hashlib


def sha256_file(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as stream:
        for chunk in iter(lambda: stream.read(1024 * 1024), b""):
            digest.update(chunk)
    return digest.hexdigest()


def build_manifest(root: Path, output: Path) -> None:
    root = root.resolve(strict=True)
    output = output.resolve()
    if not root.is_dir():
        raise ValueError(f"不是目录: {root}")
    if output == root or root in output.parents:
        raise ValueError("请把 CSV 输出到扫描目录之外")

    output.parent.mkdir(parents=True, exist_ok=True)
    with output.open("w", newline="", encoding="utf-8-sig") as stream:
        writer = csv.writer(stream)
        writer.writerow(["relative_path", "size_bytes", "sha256", "error"])
        for path in sorted(root.rglob("*")):
            if path.is_symlink() or not path.is_file():
                continue
            relative = path.relative_to(root).as_posix()
            try:
                size = path.stat().st_size
                digest = sha256_file(path)
                writer.writerow([relative, size, digest, ""])
            except OSError as exc:
                writer.writerow([relative, "", "", str(exc)])


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("directory", type=Path)
    parser.add_argument("output_csv", type=Path)
    args = parser.parse_args()
    build_manifest(args.directory, args.output_csv)

运行示例:

python manifest.py ./project ./project-manifest.csv

这里的第二个参数位于扫描目录之外。CSV 使用 utf-8-sig 编码,便于在常见表格软件中打开中文文件名。若文件在扫描过程中被其他程序修改,记录的大小和哈希可能来自不同时间点;需要严格一致性时,应先对目录做快照或暂停写入,再生成清单。对于文件数量极多的目录,还可以把排序改为流式遍历,以减少内存占用。

这份清单适合用于交付前核对和归档记录。校验时重新计算目标目录的哈希,与清单中的相对路径和哈希逐项比较即可。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。