0
        file = ['photo/*.jpg']
        images = glob.glob(random.choice(file))
        random_img = random.choice(images)
        ima = [random_img]
    inpt = ima
    # prefix path
    pre = None
    oupt = f'zip/{message.from_user.id}.zip'
    # set password value
    create_password = random.randbytes(20)
    # compress level
    com_lvl = 5
    pyminizip.compress_multiple(inpt, None, oupt, create_password, com_lvl)

Но компилятор выдает ошибку:

ValueError: expected arguments are compress_multiple(srcfiles, prefixs, zipfile, password, compress_level, progress)
  • Если вы будете плодить однотипные вопросы, я буду закрывать их как дубликаты. Читайте документацию. И не "компилятор", а "интерпретатор". – strawdog Jan 28 '22 at 12:15

1 Answers1

1

Ваша программа генерирует пароли как последовательность битов, поэтому программа будет воспринимать данный пароль как объект типа bytes:

h = random.randbytes(20)
print(type(h)) # <class 'bytes'>

Однако, если верить документации pyminizip, функция compress_multiple поддерживает следующие элементы:

  1. src file LIST path (list)
  2. src file LIST prefix path (list) or []
  3. dst file path (string)
  4. password (string) or None (to create no-password zip)
  5. compress_level(int) between 1 to 9, 1 (more fast) <---> 9 (more compress)
  6. optional function to be called during processing which takes one argument, the count of how many files have been compressed

Иными словами, пароль должен подаваться как строка, но не как последовательность битов. Из-за этого и происходит ошибка нераспознавания значений.

Отдельно отмечу второй пункт, в котором можно подавать список либо с чем-то, либо пустой [], но не None. Это тоже не даёт нормально запустить функцию.

Поэтому необходимо сгенерированную последовательность битов преобразовать в строку (см. здесь, берётся последовательность битов, каждый из них обращается в символ, и все вместе они образуют строку), а вместо None во втором аргументе передать []:

file = ['photo/*.jpg']
images = glob.glob(random.choice(file))
random_img = random.choice(images)
ima = [random_img]
inpt = ima
# prefix path
pre = None
oupt = f'zip/{message.from_user.id}.zip'
# set password value
byte_password = random.randbytes(20)
create_password = "".join(map(chr, byte_password)) # 1
# compress level
com_lvl = 5
pyminizip.compress_multiple(inpt, [], oupt, create_password, com_lvl) # 2

4500zenja
  • 3,923
  • Спасибо вам большое за разъяснение – Slim Thugs Jan 28 '22 at 14:26
  • я прогоняю через for столько раз сколько сгенерирует rand_photo, но в архиве все равно одно фото: for i in range(rand_photo): file = ['photo/*.jpg'] images = glob.glob(random.choice(file)) random_img = random.choice(images) ima = [random_img] inpt = ima # prefix path pre = None oupt = f'zip/{message.from_user.id}.zip' # set password value byte_password = random.randbytes(20) create_password = "".join(map(chr, byte_password)) # 1 # compress level com_lvl = 5 – Slim Thugs Jan 28 '22 at 14:32
  • @SlimThugs ima.append(random_img) должен добавлять внутри цикла рандомную фотографию, потому что Вы постоянно перезаписываете ima каждую итерацию цикла – 4500zenja Jan 28 '22 at 14:33
  • то есть мне нужно ? – Slim Thugs Jan 28 '22 at 14:36
  • @SlimThugs Вам нужно заменить ima = [random_img] на ima.append(random_img), чтобы не перезаписывать список изображений, и добавлять туда новые – 4500zenja Jan 28 '22 at 14:38
  • visual code желтым выделяет – Slim Thugs Jan 28 '22 at 14:40
  • @SlimThugs что выделает жёлтым и как это отражается на работоспособности программы? – 4500zenja Jan 28 '22 at 14:41
  • ima выделяется желтым – Slim Thugs Jan 28 '22 at 14:43
  • name 'ima' is not defined – Slim Thugs Jan 28 '22 at 14:43
  • @SlimThugs тогда до самого цикла определите ima = [] — как пустой список – 4500zenja Jan 28 '22 at 14:44
  • Все хорошо заработало, теперь всегда разное количество фоток. И еще вопрос: как очищать список ? – Slim Thugs Jan 28 '22 at 14:47
  • @SlimThugs ima = [] либо ima.clear() (https://www.programiz.com/python-programming/methods/list/clear) – 4500zenja Jan 28 '22 at 14:48
  • Большое спасибо – Slim Thugs Jan 28 '22 at 14:49
  • я создаю txt файл: fi_pass = open(f'pass/{message.from_user.id}.txt','w') Потом записываю в файл: fi_pass.write(create_password) Выдает ошибку 'charmap' codec can't encode character '\x90' in position 3: character maps to – Slim Thugs Jan 28 '22 at 15:28
  • Добавил create_password.encode("utf-8") но ничего не изменилось – Slim Thugs Jan 28 '22 at 15:31
  • @SlimThugs https://ru.stackoverflow.com/a/432777 — здесь предлагают сначала кодировать в latin1, а затем в utf-8 – 4500zenja Jan 28 '22 at 15:36
  • Кстати да, вопросы, не относящиеся к данному, лучше всего публиковать отдельными постами, а не в комментариях – 4500zenja Jan 28 '22 at 15:37
  • Я хотел в чат, но не дает – Slim Thugs Jan 28 '22 at 15:38
  • Добавил create_password.encode('latin1').decode('utf8') выдает 'utf-8' codec can't decode byte 0xe4 in position 3: invalid continuation byte – Slim Thugs Jan 28 '22 at 15:42
  • https://ru.stackoverflow.com/questions/1376172/Как-декодировать-пароль – Slim Thugs Jan 28 '22 at 15:46