2013-06-01 13 views
41

私はPythonでファイル内のmd5をチェックし、md5が元のものと一致することを確認するコードを作成しました。ここに私が開発したものです:Pythonでファイルのmd5チェックサムを計算するにはどうすればよいですか?

#Defines filename 
filename = "file.exe" 

#Gets MD5 from file 
def getmd5(filename): 
    return m.hexdigest() 

md5 = dict() 

for fname in filename: 
    md5[fname] = getmd5(fname) 

#If statement for alerting the user whether the checksum passed or failed 

if md5 == '>md5 will go here<': 
    print("MD5 Checksum passed. You may now close this window") 
    input ("press enter") 
else: 
    print("MD5 Checksum failed. Incorrect MD5 in file 'filename'. Please download a new copy") 
    input("press enter") 
exit 

をしかし、私は、コードを実行するたびに、私は次を得る:

Traceback (most recent call last): 
File "C:\Users\Username\md5check.py", line 13, in <module> 
md5[fname] = getmd5(fname) 
File "C:\Users\Username\md5check.py, line 9, in getmd5 
    return m.hexdigest() 
NameError: global name 'm' is not defined 

は、私は私のコードで行方不明です何がありますか?

+0

[ファイルのMD5チェックサムを生成しますか?](http://stackoverflow.com/questions/3431825/generating-a-md5-checksum-of-a-file) – pylover

答えて

108

あなたのエラーとあなたのコードに何が欠けているかに関して。 mはgetmd5()関数で定義されていない名前です。あなたは初心者であることは知っていますが、あなたのコードはどこにでもあります。あなたの問題を1つずつ見てみましょう:)まず、hashlib.md5.hexdigest()メソッドを正しく使用していません。 haslib関数の説明をPython Doc Libraryで見つけてください。

>>> import hashlib 
>>> hashlib.md5("filename.exe").hexdigest() 
'2a53375ff139d9837e93a38a279d63e5' 

しかし、あなたはここに大きな問題があります提供文字列にMD5を返すための正しい方法はこのような何かを行うことです。 ファイル名文字列でMD5を計算しています。実際にはMD5はファイルの内容に基づいて計算されています。基本的にはファイルの内容を読み込み、md5を通してパイプする必要があります。私の次の例では、非常に効率的ではありませんが、そのようなこと:

>>> import hashlib 
>>> hashlib.md5(open('filename.exe','rb').read()).hexdigest() 
'd41d8cd98f00b204e9800998ecf8427e' 

あなたがはっきりと見ることができるように、第2 MD5ハッシュは最初のものとは全く異なるものです。その理由は、ファイル名だけでなく、ファイルの内容を突き抜けているからです。簡単な解決策は、そのようなことが考えられます。

# Import hashlib library (md5 method is part of it) 
import hashlib  

# File to check 
file_name = 'filename.exe'  

# Correct original md5 goes here 
original_md5 = '5d41402abc4b2a76b9719d911017c592' 

# Open,close, read file and calculate MD5 on its contents 
with open(file_name) as file_to_check: 
    # read contents of the file 
    data = file_to_check.read()  
    # pipe contents of the file through 
    md5_returned = hashlib.md5(data).hexdigest() 

# Finally compare original MD5 with freshly calculated 
if orginal_md5 == md5_returned: 
    print "MD5 verified." 
else: 
    print "MD5 verification failed!." 

Python: Generating a MD5 checksum of a fileポストを見てください、それが効率的に実現する方法の方法の詳細カップルに説明しています。

幸運のベスト。

+0

Wow。私はとても恥ずかしい気がする。私がやっていたことに間違ったコードを付けて、それに沿って多くの間違いを加えました。ご協力いただきありがとうございます。私はバッチやLUAにもっと慣れていますが。だから、Pythonは私のためにピカピカです。 – user2344996

+10

また、open(file_name、 'rb')でバイナリモードでファイルを開く必要があります。そうしないと、osが改行/改行の変換を行うときに問題が発生する可能性があります。 https://mail.python.org/pipermail/tutor/2004-January/027634.htmlおよびhttp://stackoverflow.com/questions/3431825/python-generating-a-md5-checksum-of-a-fileを参照してください。 ?rq = 1 – twobeers

+3

バイナリファイルで作業している場合は、正しく 'b'モードで読み込んで、最後に期待通りに動作させるようにしてください:hashlib.sha512(open(fn、 'rb')。 ())。hexdigest() –

関連する問題