Python实现CSV指定列SHA256哈希转Base64编码报错求助
解决Python哈希CSV列时的TypeError问题
问题描述
作为Python新手,目标是读取CSV文件,对指定列consumer_id使用SHA256哈希后以Base64编码输出。运行代码时出现TypeError,错误信息:
TypeError: Strings must be encoded before hashing
当前代码:
import hashlib import csv import base64 with open('File1.csv') as csvfile: with open('File2.csv', 'w') as newfile: reader = csv.DictReader(csvfile) for i, r in enumerate(reader): # 写入CSV表头 if i == 0: newfile.write(','.join(r) + '\n') # 哈希'consumer_id'列 r['consumer_id'] = base64.b64encode(hashlib.sha256(r['consumer_id']).encode('utf-8')).digest() # 写入处理后的行 newfile.write(','.join(r.values()) + '\n')
错误原因
错误核心是哈希函数需要接收字节类型(bytes)数据,而非字符串,原代码的调用逻辑完全颠倒:
- 直接把字符串
r['consumer_id']传给hashlib.sha256(),违反哈希函数的参数要求 - 错误地对哈希对象调用
.encode('utf-8'),属于无效操作 .digest()的调用位置错误,应该先获取哈希的字节结果,再进行Base64编码
修正后的代码
import hashlib import csv import base64 with open('File1.csv', 'r', encoding='utf-8') as csvfile: with open('File2.csv', 'w', newline='', encoding='utf-8') as newfile: reader = csv.DictReader(csvfile) writer = csv.DictWriter(newfile, fieldnames=reader.fieldnames) # 写入表头 writer.writeheader() for r in reader: # 1. 将字符串编码为字节 consumer_bytes = r['consumer_id'].encode('utf-8') # 2. 计算SHA256哈希 sha256_result = hashlib.sha256(consumer_bytes).digest() # 3. Base64编码并转为字符串(避免写入CSV时出现字节标记) r['consumer_id'] = base64.b64encode(sha256_result).decode('utf-8') # 写入处理后的行 writer.writerow(r)
关键修改说明
- 修正编码顺序:先把字符串转为字节,再传入哈希函数,符合哈希函数的参数要求
- 使用CSV专用写入器:替换手动拼接字符串的方式,避免字段包含逗号时出现CSV格式错误
- Base64结果转字符串:通过
.decode('utf-8')把编码后的字节转为字符串,确保写入CSV的是文本内容 - 指定文件编码:打开文件时明确设置
encoding='utf-8',避免不同环境下的编码不一致问题
内容的提问来源于stack exchange,提问作者Jeff Irwin
相关产品推荐
相关产品推荐

