Python文件逐行哈希写入问题求助:读取File1哈希后写入File2
问题分析与修复方案
问题根源
- 累计哈希而非单行哈希:你在循环外初始化了哈希对象(
h = hashlib.sha512()/h = hashlib.md5()),每次调用h.update()会把当前行的内容追加到之前的哈希计算上下文里,导致后续行的哈希是前面所有行内容的合并哈希,而非单行独立哈希。 - 无换行符导致输出混乱:写入哈希值时没有添加换行符,所有哈希值会连成一串,无法对应输入文件的每行。
- 代码不规范:使用全局变量传递文件名,文件操作未用
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
相关产品推荐
相关产品推荐

