'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 шт):
Сдаётся мне, что вы где-то читаете совершенно другой файл в текстовом режиме. Причём делаете это в неправильной кодировке. Например, файл в кодировке 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>