diff --git a/lesson_1/homework/files/file1.zip b/file1.zip similarity index 100% rename from lesson_1/homework/files/file1.zip rename to file1.zip diff --git a/lesson_1/homework/files/file2.zip b/file2.zip similarity index 100% rename from lesson_1/homework/files/file2.zip rename to file2.zip diff --git a/lesson_1/homework/HW_2.py b/lesson_1/homework/HW_2.py new file mode 100644 index 0000000..778768e --- /dev/null +++ b/lesson_1/homework/HW_2.py @@ -0,0 +1,87 @@ +from collections import OrderedDict +import csv +import doctest +import hashlib +import os.path +import unittest + +import pytest # Run from console 'python -m pytest HW_2.py' + + +__author__ = "Vasilii Moskvin" + + +class TestHashSumm(unittest.TestCase): + def test_hash_summ(self): + self.assertEqual(get_hash_summ('I love Python', 'sha1'), '9233eac58259dd3a13d6c9c59f8001823b6b1fee') + + def test_hash_summ_exc(self): + with self.assertRaises(KeyError): + get_hash_summ('X', 'X') + + +def tst_hash_summ(in_string, in_code, ans): + assert get_hash_summ(in_string, in_code) == ans, 'Неверная сумма' + + +def get_hash_summ(in_string, in_code): + """ + Returns a hexdigest of a in_string. + :param in_string: input string + :param in_code: hash algorithm + :return: a hexdigest of a in_string + + >>> get_hash_summ('I love Python', 'sha1') # doctest: +NORMALIZE_WHITESPACE + '9233eac58259dd3a13d6c9c59f8001823b6b1fee' + + """ + dct_hash = dict(sha1=hashlib.sha1, + sha224=hashlib.sha224, + sha256=hashlib.sha256, + sha384=hashlib.sha384, + sha512=hashlib.sha512, + md5=hashlib.md5) + + h = dct_hash[in_code]() + h.update(in_string.encode('utf-8')) + + return h.hexdigest() + + +def main(): + """ + Main function. Reades need_hashes.csv. Gets hexdigest for all strings in the file. + And appends the received codes in need_hashes.csv. + :return: chenged need_hashes.csv + + """ + file_path = os.path.abspath(input('Enter path to need_hashes.csv:\n')) + my_struct = ('string', 'code', 'hex_digest') + + with open(file_path, 'r') as csv_file: + csv_file = csv.reader(csv_file, delimiter=';') + data = [OrderedDict(zip(my_struct, row)) for row in csv_file] + + for src in data: # Вопрос: Как можно такую конструкцию в одну + src['hex_digest'] = get_hash_summ(src['string'], src['code']) # строку записать? + + with open(file_path, 'w', newline='') as csv_file: + csv_file = csv.DictWriter(csv_file, delimiter=';', fieldnames=my_struct) + csv_file.writerows(data) + + +def run_test(): + """ + Conducts tests get_hash_summ(in_string, in_code). + assert, doctest, unittest + :return: Results of tests get_hash_summ(in_string, in_code) + + """ + tst_hash_summ('I love Python', 'sha1', '9233eac58259dd3a13d6c9c59f8001823b6b1fee') + doctest.testmod() + unittest.main() + + +if __name__ == '__main__': + #run_test() + main() \ No newline at end of file diff --git a/lesson_1/homework/HW_3.py b/lesson_1/homework/HW_3.py new file mode 100644 index 0000000..f99df07 --- /dev/null +++ b/lesson_1/homework/HW_3.py @@ -0,0 +1,205 @@ +from collections import OrderedDict +import os +import re +import hashlib + + +__author__ = "Vasilii Moskvin" + + +def get_hash_summ(in_byte, in_code): + """ + Returns a hexdigest of a in_byte. + :param in_byte: input byte string + :param in_code: hash algorithm + :return: a hexdigest of a in_string + + >>> get_hash_summ('I love Python', 'sha1') # doctest: +NORMALIZE_WHITESPACE + '9233eac58259dd3a13d6c9c59f8001823b6b1fee' + + """ + dct_hash = dict(sha1=hashlib.sha1, + sha224=hashlib.sha224, + sha256=hashlib.sha256, + sha384=hashlib.sha384, + sha512=hashlib.sha512, + md5=hashlib.md5) + + h = dct_hash[in_code]() + h.update(in_byte) + + return h.hexdigest() + + +# ------------------------------------------------------3.1------------------------------------------------------------ + +''' + Реализовать функцию разбиения файла на кусочки указанной длины. + + На входе: имя исходного файла и размер в байтах для разрезания файла
+ На выходе: количество полученных файлов-фрагментов + +''' + + +def cut_file(file_path, size): + """ + Cuts the file 'file_path' into several parts of the size 'size' + :param file_path: path to file + :param size: size of parts + :return: several parts of the file 'file_path' + + """ + dir_path = os.sep.join(file_path.split(os.sep)[:-1]) + with open(file_path, 'rb') as f: + raw_data = f.read() + + reg = '.{{1,{}}}'.format(size) + data = re.findall(bytes(reg, encoding='utf-8'), raw_data, re.DOTALL) + + for index, src in enumerate(data): + with open(os.path.join(dir_path, 'cut_{}'.format(str(index))), 'wb') as f: + f.write(src) + + return str(index) + + +def tst_cut_file(file_path, dir_path): + """ + Tests function cut_file(file_path, size) + :param file_path: path to cut file + :param dir_path: path to directory with cut file + :return: error, if the file was not properly cut + + """ + lst_dir = [os.path.join(dir_path, filename) for filename in os.listdir(dir_path) if filename.startswith('cut_')] + + log_path = os.path.join(dir_path, 'log.jpg') + with open(log_path, 'wb') as f: + for src in sorted(lst_dir, key=lambda x: float(re.findall(r'.*_(\d+)$', x)[0])): + with open(src, 'rb') as temp_f: + temp_data = temp_f.read() + f.write(temp_data) + + with open(log_path, 'rb') as f: + log_data = f.read() + log_hash = get_hash_summ(log_data, 'md5') + + with open(file_path, 'rb') as f: + file_data = f.read() + file_hash = get_hash_summ(file_data, 'md5') + + os.remove(log_path) + + assert log_hash == file_hash, 'Cut file error' + + +# ------------------------------------------------------3.2------------------------------------------------------------ + +''' + Реализовать функцию составления текстового файла с md5-хэшами файлов в указанной директории + + На входе: имя директории с файлами, имя файла для записи результатов
+ На выходе: количество просмотренных файлов + +''' + + +def get_hash_in_dir(dir_path, res_path): + """ + Returns file with the list of hash summs from files in the dir_path. + :param dir_path: path to directory with files + :param res_path: path to result files + :return: file with the list of hash summs from files in the dir_path + + """ + lst_files = [os.path.join(dir_path, file_name) for file_name in os.listdir(dir_path) + if not file_name.endswith('.md5')] + + lst_hash = [] + for file_path in lst_files: + with open(file_path, 'rb') as f: + data = f.read() + lst_hash.append(get_hash_summ(data, 'md5')) + + with open(res_path, 'w') as f: + for hash_line in lst_hash: + f.write('{}\n'.format(hash_line)) + + return len(lst_files) + + +# ------------------------------------------------------3.3------------------------------------------------------------ + +''' + Реализовать функцию "склеивания" файла на основе упорядоченных хэш-сумм + + На входе: имя директории с файлами-кусочками, имя файла с хэш-суммами, имя выходного файла
+ На выходе: размер полученного файла + +''' + + +def get_full_file(dir_path, md5_file_path, res_path): + """ + Creates full file from many parts. + :param dir_path: path to directory with parts of full file + :param md5_file_path: path to list of hash summs + :param res_path: path to result file + :return: Creates full file from many parts + + """ + lst_files = [os.path.join(dir_path, file_name) for file_name in os.listdir(dir_path) + if not file_name.endswith('.md5')] + + with open(md5_file_path, 'r') as f: + hash_summ = OrderedDict(map(lambda line: (line.strip(), ''), f)) + + for file_path in lst_files: + with open(file_path, 'rb') as f: + data = f.read() + h = hashlib.md5() + h.update(data) + hash_summ[h.hexdigest()] = file_path + + with open(res_path, 'wb') as f_res: + for hash, file_path in hash_summ.items(): + with open(file_path, 'rb') as f: + data = f.read() + f_res.write(data) + + return os.path.getsize(res_path) + + +def main(): + # --------------------------------------3.1----------------------------------------------------------------------- + + print('№ 3.1 "Cut file"') + dir_path = os.path.abspath(input('Enter path to directory with cut file:\n')) + file_path = os.path.join(dir_path, input('Enter the name of cut file:\n')) + size = int(input('Enter the size of cut parts (bytes):\n')) + + print('Count of new files: {}'.format(cut_file(file_path, size))) + + tst_cut_file(file_path, dir_path) + + # --------------------------------------3.2----------------------------------------------------------------------- + + print('№ 3.2 "List of hash in a directory"') + dir_path = os.path.abspath(input('Enter path to directory with files:\n')) + res_path = os.path.abspath(input('Enter path to result file:\n')) + + print('Viewed {} files'.format(get_hash_in_dir(dir_path, res_path))) + + # --------------------------------------3.3----------------------------------------------------------------------- + + print('№ 3.3 "Creates full file from many parts."') + dir_path = os.path.abspath(input('Enter path to directory with files:\n')) + md5_file_path = os.path.abspath(input('Enter path to file with list of hashes:\n')) + res_path = os.path.abspath(input('Enter path to result file:\n')) + + print('Size of reuslt file: {} bytes'.format(get_full_file(dir_path, md5_file_path, res_path))) + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/lesson_1/homework/file1.zip b/lesson_1/homework/file1.zip new file mode 100644 index 0000000..255ef96 Binary files /dev/null and b/lesson_1/homework/file1.zip differ diff --git a/lesson_1/homework/file2.zip b/lesson_1/homework/file2.zip new file mode 100644 index 0000000..07505e1 Binary files /dev/null and b/lesson_1/homework/file2.zip differ diff --git a/lesson_1/homework/need_hashes.csv b/lesson_1/homework/need_hashes.csv index 7e732da..69384d0 100644 --- a/lesson_1/homework/need_hashes.csv +++ b/lesson_1/homework/need_hashes.csv @@ -1,5 +1,5 @@ I love Python;sha1;9233eac58259dd3a13d6c9c59f8001823b6b1fee -Я люблю Питон;md5; -Guido like beer;sha512; -Тили-мили-трямзия;md5; -Spam and eggs and ham;sha1; +Я люблю Питон;md5;8cda44d3a8ca06e9ebcd9e50fbb060a9 +Guido like beer;sha512;9490ca5a146f482ea40649b832017dbec7279462766ec6e02fac4c7910584c50572b3efd3d257c089431b8b88603226a9d3aa2fcd4185fcc8db9f71114e06d93 +Тили-мили-трямзия;md5;178d4b8a96e116c4462bfed4b6e83988 +Spam and eggs and ham;sha1;c13dd8ebf6f20c890594773c965932336d58277a diff --git a/lesson_1/homework/pep8_me.py b/lesson_1/homework/pep8_me.py index d6b19fa..f69afca 100644 --- a/lesson_1/homework/pep8_me.py +++ b/lesson_1/homework/pep8_me.py @@ -2,28 +2,31 @@ import string -def create_file(namef,dir,size): - if(size.isdigit()!=True): - if size.endswith('KB')==True: - s1 = size.split('KB') - size1 = int(s1[0])*1024 - token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in range(size1)) - if size.endswith('MB')==True: - s1 = size.split('MB') - size1 = int(s1[0])*1048567 - token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in range(size1)) - if size.endswith('GB') == True: - s1 = size.split('GB') - size1 = int(s1[0]) * 1073741824 - token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in range(size1)) - else: - token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for x in range(int(size))) - - file = open(dir+namef,"w") +def create_file(name_f, dir_path, size): + if not size.isdigit(): + if size.endswith('KB'): + s1 = size.split('KB') + size1 = int(s1[0]) * 1024 + token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) + for _ in range(size1)) + elif size.endswith('MB'): + s1 = size.split('MB') + size1 = int(s1[0]) * 1048567 + token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) + for _ in range(size1)) + elif size.endswith('GB'): + s1 = size.split('GB') + size1 = int(s1[0]) * 1073741824 + token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) + for _ in range(size1)) + else: + token = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) + for _ in range(int(size))) + with open(dir_path + name_f, "w") as file: # По-хорошшему, здесь нужно использовать os.path.join(dir_path, name_f) file.write(token) + - -create_file("/test1.txt","E:",'10KB') -create_file("/test2.txt","E:",'1024') -create_file("/test11.txt","E:",'2MB') -create_file("/test21.txt","E:",'1B') \ No newline at end of file +create_file("/test1.txt", "E:", '10KB') +create_file("/test2.txt", "E:", '1024') +create_file("/test11.txt", "E:", '2MB') +create_file("/test21.txt", "E:", '1B')