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

Python文件逐行哈希写入问题求助:读取File1哈希后写入File2

问题分析与修复方案

问题根源

  1. 累计哈希而非单行哈希:你在循环外初始化了哈希对象(h = hashlib.sha512()/h = hashlib.md5()),每次调用h.update()会把当前行的内容追加到之前的哈希计算上下文里,导致后续行的哈希是前面所有行内容的合并哈希,而非单行独立哈希。
  2. 无换行符导致输出混乱:写入哈希值时没有添加换行符,所有哈希值会连成一串,无法对应输入文件的每行。
  3. 代码不规范:使用全局变量传递文件名,文件操作未用with语句(会自动处理文件关闭,避免资源泄漏)。

修复后的代码

import hashlib

def hash_file(input_filename, output_filename, algo):
    # 根据选择的算法创建对应的哈希函数
    hash_func = hashlib.sha512 if algo == '1' else hashlib.md5
    
    # 使用with语句自动管理文件资源
    with open(input_filename, 'r', encoding='utf-8') as infile, open(output_filename, 'w', encoding='utf-8') as outfile:
        for line in infile:
            # 去除换行符,保留行内其他空格(如果需要去除所有首尾空白,用strip())
            cleaned_line = line.rstrip('\n')
            # 每次循环创建新的哈希对象,确保每行独立计算
            h = hash_func()
            h.update(cleaned_line.encode('utf-8'))
            hashed_line = h.hexdigest()
            # 写入哈希值并添加换行符
            outfile.write(f"{hashed_line}\n")

def main():
    input_file = input("Input file name to pull words from: ")
    output_file = input("Filename to save as: ")
    
    while True:
        algo_choice = input("Select hashing algorithm: '1' (sha512), '2' (md5): ")
        if algo_choice in ('1', '2'):
            hash_file(input_file, output_file, algo_choice)
            print("哈希转换完成")
            break
        else:
            print("请选择有效的选项:1 或 2")

if __name__ == "__main__":
    main()

关键修改说明

  • 每行独立哈希:将哈希对象的创建移到for循环内部,确保每行都使用全新的哈希上下文计算独立哈希。
  • 添加换行符:写入时用f"{hashed_line}\n"确保每个哈希值占一行,和输入文件行对应。
  • 使用with语句:自动处理文件的打开和关闭,避免忘记关闭文件导致的资源泄漏。
  • 移除全局变量:改用函数参数传递文件名,代码更模块化、可复用。
  • 优化算法选择逻辑:用条件表达式简化哈希函数的选择,循环逻辑更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:43:12