使用Python对CSV进行MD5哈希处理

3

我有一个包含电子邮件地址的csv文件,需要以MD5格式进行哈希处理,然后将哈希处理的电子邮件保存为新的csv文件。我在SO上没有看到与我的确切用例相同的情况,并且无法成功修改现有问题。

原始文件路径是"/Users/[username]/Downloads/email_original.csv",期望输出文件将是"/Users/[username]/Downloads/email_hashed.csv"

原始文件

email_addr
fake_email1@yahoo.com
fake_email2@gmail.com
fake_email3@college.edu
fake_email4@hotmail.com
fake_email5@ford.com

哈希文件

email_addr
0x3731BF23851200A7607BA554EEAF7912
0xA5D5D3B99896D32BAC64162BD56BE177
0xAE03858BDFBDF622AF5A1852317500C3
0xC870F8D75180AC9DA2188129C910489B
0xD7AFD8085548808459BDEF8665C8D52A

1
你卡在哪里了?展示一下你目前的最佳尝试并解释具体问题会有所帮助。 - Lev Levitsky
1
提取数据,如果它不等于“email_addr”,则使用hashlib.md5进行哈希处理,然后写入文件。 - ForceBru
这不是一个软件编写服务。我向人们收费为他们编写应用程序。但是,如果您遇到困难,我们很乐意在展示您尝试过的内容后为您提供帮助。 - Bob Dylan
1
看看这个。你可以修改它来跳过第一行。 https://linuxreference.wordpress.com/2011/01/20/howto-compute-md5-hash-each-sentence-in-file-using-python/ - obscurite
1
很好,你已经接近成功了。现在你只需要搜索一下如何在Python中写入文件就行了。非常简单。 :) - obscurite
显示剩余4条评论
2个回答

3

你评论中的答案几乎正确。你只需要使用写入属性 w 打开另一个文件。我已经修改了你的查询,使用 with 语句,这样你就不需要显式地关闭文件处理程序:

with open("/Users/[username]/Downloads/email_original.csv",'rb')  as file:
    with open("/Users/[username]/Downloads/email_hashed.csv",'w')  as output:
        for line in file: 
           line=line.strip() 
           print hashlib.md5(line).hexdigest() 
           output.write(hashlib.md5(line).hexdigest() +'\n')

太好了。非常感谢@Jaco。 - Frank B.
嘿@Jaco,当我在实际包含数百万封电子邮件的文件上运行此代码时,终端仅打印出7个哈希电子邮件,并仅将这7个保存在“..._hashed.csv”文件中。你有什么想法为什么只有这几个?没有错误提示。 - Frank B.
我无法在我的测试文件中复现这个问题。每一行都有回车符吗? - Alex
很奇怪,但文件似乎是我这边的问题。我会进行调查,但代码没有问题。谢谢。 - Frank B.

0

Jaco的回答很好,但不完整,因为它忽略了MD5哈希的编码。如果CSV格式在将来被修改以包含其他列,那么这段代码也会不足够。下面是一个例子,解决了这两个问题,同时还可以轻松地在将来更改哈希算法,并指定其他列可以应用个别哈希算法:

import csv
import hashlib

IN_PATH = 'email_original.csv'
OUT_PATH = 'email_hashed.csv'
ENCODING = 'ascii'
HASH_COLUMNS = dict(email_addr='md5')


def main():
    with open(IN_PATH, 'rt', encoding=ENCODING, newline='') as in_file, \
            open(OUT_PATH, 'wt', encoding=ENCODING, newline='') as out_file:
        reader = csv.DictReader(in_file)
        writer = csv.DictWriter(out_file, reader.fieldnames)
        writer.writeheader()
        for row in reader:
            for column, method in HASH_COLUMNS.items():
                data = row[column].encode(ENCODING)
                digest = hashlib.new(method, data).hexdigest()
                row[column] = '0x' + digest.upper()
            writer.writerow(row)

if __name__ == '__main__':
    main()

当我运行你的版本时,我得到了以下错误:Traceback (most recent call last): File "<stdin>", line 2, in <module> File "<stdin>", line 2, in main TypeError: file()最多只需要3个参数(给出了4个) - Frank B.
@FrankB。你可能在Python 2.x系列的解释器中遇到了这个错误。如果你在最新版本的Python 3中运行它,代码应该是没问题的。 - Noctis Skytower

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接