如何在Python中检查字符串和文件的内容是否相同?

2 投票
6 回答
4864 浏览
提问于 2025-04-16 23:00

我刚接触Python,有个问题想请教。怎么在Python中检查两个文件(一个是字符串,一个是文件)是否内容相同呢?我需要下载一些东西并重命名,但我不想把相同的东西用两个或更多不同的名字保存(因为相同的东西可能在不同的IP地址上)。

6 个回答

2

如果你只是想要一个校验和,其实不需要使用哈希。Python里有一个可以生成校验和的工具,叫做binascii模块

binascii.crc32(data[, crc])
5

使用文件内容的sha1哈希值。

#!/usr/bin/env python
from __future__ import with_statement
from __future__ import print_function

from hashlib import sha1

def shafile(filename):
    with open(filename, "rb") as f:
        return sha1(f.read()).hexdigest()

if __name__ == '__main__':
    import sys
    import glob
    globber = (filename for arg in sys.argv[1:] for filename in glob.glob(arg))
    for filename in globber:
        print(filename, shafile(filename))

这个程序可以在命令行中使用通配符,但这只是为了演示效果。

5

如果文件很大,我建议像这样分块读取:

compare.py:

import hashlib

teststr = "foo"
filename = "file.txt"

def md5_for_file(f, block_size=2**20):
    md5 = hashlib.md5()
    while True:
        data = f.read(block_size)
        if not data:
            break
        md5.update(data.encode('utf8'))
    return md5.digest()


md5 = hashlib.md5()
md5.update((teststr + "\n").encode('utf8'))
digest = md5.digest()
f = open(filename, 'r')
print(md5_for_file(f) == digest)

file.txt:

foo

这个程序会在字符串和文件匹配时打印出 True。

撰写回答