'charmap' codec can't decode byte 0x98 При чтении файла

Суть в том, что я шифрую файлы

def encrypt_file(self, in_filename, out_filename=None, chunksize=64 * 1024):
    if not out_filename:
        out_filename = in_filename + '.enc'

    iv = Random.new().read(AES.block_size)
    encryptor = AES.new(self.key, AES.MODE_CBC, iv)
    filesize = os.path.getsize(in_filename)

    with open(in_filename, 'rb') as infile:
        with open(out_filename, 'wb') as outfile:
            outfile.write(struct.pack('<Q', filesize))
            outfile.write(iv)

            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += bytes(' ' * (16 - (len(chunk) % 16)), 'utf-8')

                outfile.write(encryptor.encrypt(chunk))

а потом дешифрую

def decrypt_file(self, in_filename, out_filename=None, chunksize=24 * 1024):
    if not out_filename:
        out_filename = os.path.splitext(in_filename)[0]

    with open(in_filename, 'rb') as infile:
        origsize = struct.unpack('<Q', infile.read(struct.calcsize('Q')))[0]
        iv = infile.read(16)
        decryptor = AES.new(self.key, AES.MODE_CBC, iv)

        with open(out_filename, 'wb') as outfile:
            while True:
                chunk = infile.read(chunksize)
                if len(chunk) == 0:
                    break
                outfile.write(decryptor.decrypt(chunk))

            outfile.truncate(origsize)
    os.remove(in_filename)

я уже пробовал ставить кодировки при открытии, примерно как здесь, но безуспешно.

with open(in_filename, encoding="utf-8" ,mode ='rb') as infile:

Как исправить эту ошибку?

'charmap' codec can't decode byte 0x98 in position 231495: character maps to


Ответы (1 шт):

Автор решения: GrAnd

Сдаётся мне, что вы где-то читаете совершенно другой файл в текстовом режиме. Причём делаете это в неправильной кодировке. Например, файл в кодировке utf-8 читаете в Windows без явного указания кодировки (к примеру, у Windows с русской locale кодировка по-умолчанию cp1251).

Для теста, я создал файл со смайликом в кодировке utf-8. В нём записано всего 4 байта с кодами \xF0\x9F\x98\xA2, которые представляют вот этот символ: ?

Далее, я открывал файл с указанием кодировки и без:

with open('test.txt', 'r', encoding='utf-8') as f:
    print("utf-8")
    text = f.read()
    print("Done")

with open('test.txt', 'r') as f:
    print("default")
    text = f.read()
    print("Done")

И на втором чтении (без указания кодировки) я получил вашу ошибку (и даже на том же самом злополучном байте 0x98):

D:\Programming\Python\1>python codepage.py
utf-8
Done
default
Traceback (most recent call last):
  File "codepage.py", line 8, in <module>
    text = f.read()
  File "C:\Python37\lib\encodings\cp1251.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 19: character maps to <undefined>
→ Ссылка