显然,以下是有效的语法
my_string = b'The string'
Run Code Online (Sandbox Code Playgroud)
我想知道:
b字在前面的字符串是什么意思?我在SO上找到了一个相关的问题,但是这个问题是关于PHP的,它表示b用于表示字符串是二进制的,而不是Unicode,这是代码与PHP版本兼容所需的代码<6 ,当迁移到PHP 6.我不认为这适用于Python.
我确实在Python网站上找到了关于使用相同语法的字符将字符串指定为Unicode的文档u.不幸的是,它没有提到该文档中任何地方的b字符.
而且,只是出于好奇,有没有比多符号b和u是做其他事情?
有没有简单的方法来生成(和检查)Python中文件列表的MD5校验和?(我有一个小程序,我正在研究,我想确认文件的校验和).
我有一个非常大的文件4GB,当我尝试阅读它时,我的电脑挂起.所以我想逐一阅读它并在处理完每件之后将处理过的零件存储到另一个文件中并阅读下一篇文章.
yield这些作品有什么方法吗?
我很想拥有一种懒惰的方法.
我想让python读取到EOF,这样我就可以得到一个合适的哈希值,无论是sha1还是md5.请帮忙.这是我到目前为止:
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
Run Code Online (Sandbox Code Playgroud) 使用python 2.7,以下代码计算文件内容的mD5 hexdigest.
(编辑:嗯,不是因为答案已经显示,我只是这么认为).
import hashlib
def md5sum(filename):
f = open(filename, mode='rb')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf)
return d.hexdigest()
Run Code Online (Sandbox Code Playgroud)
现在,如果我使用python3运行该代码,则会引发TypeError异常:
d.update(buf)
TypeError: object supporting the buffer API required
Run Code Online (Sandbox Code Playgroud)
我发现我可以使用python2和python3运行代码,将其更改为:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
Run Code Online (Sandbox Code Playgroud)
现在我仍然想知道为什么原始代码停止工作.看来,当使用二进制模式修饰符打开文件时,它返回整数而不是编码为字节的字符串(我说因为type(buf)返回int).这种行为是在某处解释的吗?
我有很多很多文件要上传到服务器,我只想要一种方法来避免重复.
因此,从一个大字符串生成一个唯一的小键值似乎是校验和要做的事情,并且散列看起来就像是它的演变.
所以我打算使用hash md5来做到这一点.但后来我在某处读到"MD5并不是唯一的密钥",我觉得这很奇怪.
这样做的正确方法是什么?
编辑:顺便说一句,我采取了两个 来源来实现以下目标,这就是我目前正在做的事情,并且它的工作正常,使用Python 2.5:
import hashlib
def md5_from_file (fileName, block_size=2**14):
md5 = hashlib.md5()
f = open(fileName)
while True:
data = f.read(block_size)
if not data:
break
md5.update(data)
f.close()
return md5.hexdigest()
Run Code Online (Sandbox Code Playgroud) 这是参考Get MD5 hash of big files in Python and Hashlib in Windows and Linux
针对这两个问题,建议在函数 md5.update() 中使用更大的数据块来提高性能。
我所做的所有测试似乎都表明使用较小的块可以提供最佳性能。
考虑以下代码:
def test(factor):
filehash = hashlib.md5()
blk_size_to_read = filehash.block_size * (2**factor)
with open(largetestfile, 'rb') as f:
read_data = f.read(blk_size_to_read)
filehash.update(read_data)
filehash.digest()
if __name__ == '__main__':
for ctr in xrange(0, 12):
funcstr = "test({})".format(str(ctr))
timetaken = timeit.timeit(funcstr, setup="from __main__ import test", number = 5000)
print "Factor: {} Time: {}".format(str(ctr), str(timetaken))
Run Code Online (Sandbox Code Playgroud)
我所做的所有测试都表明,使用factor0 或 1(即 64 或 128 字节)时可实现最佳性能。
为什么我看到的结果与引用的问题中指出的结果不同?
我尝试过大小从 700MB …
我需要一个智能复制功能,以实现可靠,快速的文件复制和链接.文件非常大(从几千兆字节到超过200GB)并分布在很多文件夹中,人们在白天重命名文件和文件夹,所以我想使用哈希来查看我是否已经复制了一个文件,可能是一个不同的名称,只在这种情况下创建一个链接.
我是哈希全新的,我在这里使用这个函数哈希:
import hashlib
def calculate_sha256(cls, file_path, chunk_size=2 ** 10):
'''
Calculate the Sha256 for a given file.
@param file_path: The file_path including the file name.
@param chunk_size: The chunk size to allow reading of large files.
@return Sha256 sum for the given file.
'''
sha256 = hashlib.sha256()
with open(file_path, mode="rb") as f:
for i in xrange(0,16):
chunk = f.read(chunk_size)
if not chunk:
break
sha256.update(chunk)
return sha256.hexdigest()
Run Code Online (Sandbox Code Playgroud)
对于3GB文件,这需要一分钟,因此最终,16TB HD的过程可能非常慢.
现在我的想法是使用一些关于文件内部结构的额外知识来加快速度:我知道它们包含一个小标题,然后是大量的测量数据,我知道它们包含实时时间戳,所以我很确保两个文件的前16MB相同的可能性非常低(为了实现这一点,需要在完全相同的环境条件下同时创建两个文件).所以我的结论是,它应该足以只散列每个文件的第一个X MB.
它适用于我的示例数据,但由于我没有经验,我只想询问是否有一些我不知道的事情(隐藏的危险或更好的方法).
非常感谢你!
嘿伙计们,我正在使用python函数获取几个文件的MD5
filehash = hashlib.md5(file)
print "FILE HASH: " + filehash.hexdigest()
Run Code Online (Sandbox Code Playgroud)
虽然我去终点站做了一个
md5 file
Run Code Online (Sandbox Code Playgroud)
我得到的结果与我的python脚本输出不一样(它们不匹配).有人知道为什么会这样吗?谢谢.
我正在尝试确定某些文件的数据一致性.但是,MD5的变化不同.当我执行时md5sum,哈希是相等的:
import hashlib
import os
import sys
def hash_file_content(path):
try:
if not os.path.exists(path):
raise IOError, "File does not exist"
encode = hashlib.md5(path).hexdigest()
return encode
except Exception, e:
print e
def main():
hash1 = hash_file_content("./downloads/sample_file_1")
hash2 = hash_file_content("./samples/sample_file_1")
print hash1, hash2
if __name__ == "__main__":
main()
Run Code Online (Sandbox Code Playgroud)
输出意外地不同:
baed6a40f91ee5c44488ecd9a2c6589e 490052e9b1d3994827f4c7859dc127f0
Run Code Online (Sandbox Code Playgroud)
现在md5sum:
md5sum ./samples/sample_file_1
9655c36a5fdf546f142ffc8b1b9b0d93 ./samples/sample_file_1
md5sum ./downloads/sample_file_1
9655c36a5fdf546f142ffc8b1b9b0d93 ./downloads/sample_file_1
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况,我该如何解决这个问题呢?
python ×10
hash ×5
md5 ×5
hashlib ×4
checksum ×2
binary ×1
cryptography ×1
file-io ×1
generator ×1
python-3.x ×1
sha1 ×1
string ×1
unicode ×1
unique-key ×1