Source code for aiida.common.files

# -*- coding: utf-8 -*-
###########################################################################
# Copyright (c), The AiiDA team. All rights reserved.                     #
# This file is part of the AiiDA code.                                    #
#                                                                         #
# The code is hosted on GitHub at https://github.com/aiidateam/aiida-core #
# For further information on the license, see the LICENSE.txt file        #
# For further information please visit http://www.aiida.net               #
###########################################################################
"""Utility functions to operate on filesystem files."""
import hashlib


[docs]def md5_from_filelike(filelike, block_size_factor=128): """Create the hexdigested md5 checksum of the contents from a filelike object. :param filelike: the filelike object for whose contents to generate the md5 checksum :param block_size_factor: the file is read at chunks of size ``block_size_factor * md5.block_size``, where ``md5.block_size`` is the block_size used internally by the hashlib module. :returns: a string with the hexdigest md5. :raises: no checks are done on the filelike object, so it may raise IOError if it cannot be read from. """ md5 = hashlib.md5() # I read 128 bytes at a time until it returns the empty string b'' for chunk in iter(lambda: filelike.read(block_size_factor * md5.block_size), b''): md5.update(chunk) return md5.hexdigest()
[docs]def md5_file(filepath, block_size_factor=128): """Create the hexdigested md5 checksum of the contents from :param filepath: the filepath of the file for which we want the md5sum :param block_size_factor: the file is read at chunks of size ``block_size_factor * md5.block_size``, where ``md5.block_size`` is the block_size used internally by the hashlib module. :returns: a string with the hexdigest md5. :raises: No checks are done on the file, so if it doesn't exists it may raise IOError. """ with open(filepath, 'rb', encoding=None) as handle: return md5_from_filelike(handle, block_size_factor=block_size_factor)
[docs]def sha1_file(filename, block_size_factor=128): """ Open a file and return its sha1sum (hexdigested). :param filename: the filename of the file for which we want the sha1sum :param block_size_factor: the file is read at chunks of size ``block_size_factor * sha1.block_size``, where ``sha1.block_size`` is the block_size used internally by the hashlib module. :returns: a string with the hexdigest sha1. :raises: No checks are done on the file, so if it doesn't exists it may raise IOError. """ sha1 = hashlib.sha1() with open(filename, 'rb', encoding=None) as fhandle: # I read 128 bytes at a time until it returns the empty string b'' for chunk in iter(lambda: fhandle.read(block_size_factor * sha1.block_size), b''): sha1.update(chunk) return sha1.hexdigest()