我还在接触Python,但我的目标是读取CSV文件,使用SHA256散列特定的列,然后以Base64输出。
下面是需要进行的转换示例
此计算器可在https://www.liavaag.org/English/SHA-Generator/中找到
这是我目前拥有的代码
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):
# writing csv headers
if i == 0:
newfile.write(','.join(r) + '\n')
# hashing the 'CardNumber' column
r['consumer_id'] = base64.b64encode(hashlib.sha256(r['consumer_id']).encode('utf-8')).digest()
# writing the new row to the file with hashed 'CardNumber'
newfile.write(','.join(r.values()) + '\n')
我收到的错误是
r['consumer_id'] = base64.b64encode(hashlib.sha256(r['consumer_id']).encode('utf-8')).digest()
TypeError: Strings must be encoded before hashing
2条答案
按热度按时间1qczuiv01#
你的思路是正确的,只需要在一次性完成之前先迈出一步,看看它是如何拼凑起来的:
这应该给予你:
作为“一句话”:
正如您所看到的,您当前的用法很接近,但只是有一些括号需要修正。
如果你想在一个循环中使用这个函数,比如在遍历单词列表或csv的行时,你可以这样做:
为您提供:
假设您的代码的其余部分工作如您所愿,那么:
egdjgwm82#
除了JonSG关于正确获取散列/编码的回答之外,我还想对您如何阅读CSV文件发表一些评论。
我花了一点时间来理解你是如何处理CSV的头文件和正文的:
起初,我没有意识到在dict上调用
join()
只会给予密钥;然后你继续加入这些价值观,真聪明我认为使用补充的DictWriter会更清楚、更容易。
为了清楚起见,我将把阅读、处理和写作分开:
在您的示例中,您将创建自己的writer并需要为其给予字段名。我刚刚传入了第一行,DictWriter()构造函数使用该dict中的键来建立头值。您需要显式调用
writeheader()
方法,然后才能写入(已处理的)行。我从这个文件1.csv开始:
最后得到了这个文件2.csv:
这种组织方式意味着所有的行首先被读入内存,你提到有“成千上万的条目”,但是对于这3个字段的数据来说,只有几百KB的RAM,也许是一MB的RAM。
如果您确实希望“流式”传输数据,则需要类似以下的内容:
在本例中,我将
reader.fieldnames
传递给DictWriter构造函数的fieldnames=
参数。对于处理多个文件,我将自己打开和关闭它们,因为多个
with open(...) as x
在我看来可能很混乱:对于这些简单的实用程序脚本,我看不出上下文管理器有什么真实的的好处:如果程序失败,它将自动关闭文件。
但是传统的智慧是像你一样使用
with open(...) as x
上下文管理器,你可以像你一样嵌套separate them with a comma,或者如果你有Python 3.10+,使用分组括号来更清晰地看(也在Q/A中)。