You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rclone-Python计算哈希时触发ValueError错误求助

问题原因与解决方案

核心原因

这个错误的本质是rclone-python库的hash方法处理输出时的逻辑缺陷:

  • rclone原生hashsum命令的输出格式是[哈希值] [文件路径],但当文件路径(或文件名)包含空格时,库代码里的l.split()会把路径拆成多个片段(默认按任意空白字符分割)。
  • 比如输出行是d41d8cd98f00b204e9800998ecf8427e my backup file.txt,split()后会得到3个元素,这时候试图赋值给value, key两个变量就会触发ValueError: too many values to unpack。
  • 之前脚本正常运行,是因为当时处理的所有文件都没有带空格的名称,现在遇到带空格的文件就触发了这个偶发问题。

验证方法

手动在服务器执行rclone命令,检查输出是否存在带空格的文件名:

rclone hashsum md5 <你的remote_path参数>

如果输出里有文件名包含空格的行,就能直接确认问题。

解决方案

方案1:修改rclone-python库源码(快速修复)

找到库的rclone.py文件(路径是/usr/local/lib/python3.10/dist-packages/rclone_python/rclone.py),找到第507行的value, key = l.split(),修改为:

value, key = l.split(maxsplit=1)

maxsplit=1会限制只分割第一个空格,确保后面的整个文件路径被完整作为key值。

方案2:绕过rclone-python库,直接调用rclone命令(更可靠)

如果不想修改第三方库,可以用Python的subprocess直接执行rclone命令,自己处理输出:

import subprocess
from typing import Dict

def get_hashes_from_files_remote(remote_path: str) -> Dict[str, str]:
    # 调用rclone原生命令,捕获输出
    proc = subprocess.run(
        ["rclone", "hashsum", "md5", remote_path],
        capture_output=True,
        text=True,
        check=True  # 如果rclone命令执行失败,直接抛出异常
    )
    hash_dict = {}
    for line in proc.stdout.strip().split("\n"):
        if not line:
            continue
        # 只分割第一个空格,确保文件名完整
        hash_val, file_path = line.split(maxsplit=1)
        hash_dict[file_path] = hash_val
    return hash_dict

这种方式完全避开第三方库的逻辑缺陷,兼容性更好。

方案3:规范远程文件命名(长期预防)

如果有权限控制远程文件的命名规则,尽量避免文件名或路径中出现空格、制表符等空白字符,从根源上避免这类解析错误。


内容的提问来源于stack exchange,提问作者alicethefemme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 03:16:01