Sergomen
@Sergomen
Просто делай добро и оно вернётся

Как исправить ошибку «UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa7 in position 11: invalid start byte»?

Я сделал что-то типо архиватора, и это чтото по моей задумке должно "склеивать"(и обратно. "расклеивать") файлы в один, и также если нужно склеивать так чтобы файлы "маскировались"(или хз как правильно сказать) под другие файлы. Все это работает нормально когда я "склеиваю" файлы, но вот "расклеить" их не получается изза ошибок типо:
Traceback (most recent call last):
  File "files.py", line 78, in <module>
    f_decode(file)
  File "files.py", line 36, in f_decode
    if key in codecs.utf_8_decode(ff)[0]:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa7 in position 11: invalid start byte

ошибки различаются только не декодированым байтом и позицией в зависимости от файла который хочу "расклеить".
Как это исправить?

код

#! /usr/bin/env python3
# -*- coding: utf-8 -*-

import codecs, sys, argparse

key = ":E9 EE E1 E0 ED FB E9 20 F5 F3 E9:"
help_text = '''
    -e\\-encode [файл або кілька файлів(через пробіл)] - запакувати 
    -o\\-output_file файл - кінцевий файл(обов'яковий параметр для -e\\-encode)
    -r\\--rat true\\false - замаскувати файл\\файли під інший файл(true - так,false - ні)(головний файл перший в списку -e, інші маскуються під нього)(в -o вказати файл з розширенням першого файлу)
    -d\\-decode [файл або кілька файлів(через пробіл)] - розпакувати

     '''
def r_file(file,rat):
    f = open(file,'rb')
    temp = b""
    if rat == "false":
        temp += codecs.utf_8_encode(str(key+":"+file+":\n"))[0]
    for ff in f:
        temp += ff
    f.close()

    return temp

def w_file(file,text):
    f = open(file,'wb')
    f.write(text)
    f.close()

def f_decode(file):
    f = open(file,"rb")
    name = ""
    text = b""
    n = 0
    for ff in f: 
        if key in codecs.utf_8_decode(ff)[0]: # строка 36
            text = b""
            name = codecs.utf_8_decode(ff)[0].split(":")[3]
            n = 0
        else:
            f1 = open(name,"ab")
            f1.write(ff)
            f1.close()
            
    f.close()

def createParser ():
    parser = argparse.ArgumentParser()
    parser.add_argument ('-e', '--encode', nargs='+')
    parser.add_argument ('-d', '--decode', nargs='+')
    parser.add_argument ('-o', '--output_file', nargs='?')
    parser.add_argument ('-r', '--rat', nargs='?',default="false")
    parser.add_argument ('-i', '--infa',default=None)
 
    return parser

parser = createParser()
namespace = parser.parse_args(sys.argv[1:])

if namespace.encode != None:
    if namespace.output_file == None:
        print("Параметр -o\\-output_file обов`язковий") 
    else:
        files = namespace.encode
        f = namespace.output_file
        t = b''
        rat = namespace.rat 
        for file in files:
            if rat == "true":
                t += r_file(file,"true")
                rat = "false"
            else:
                t += r_file(file,"false")
        w_file(f,t)
if namespace.decode != None:
    files = namespace.decode
    for file in files:
        f_decode(file) #строка 78

if namespace.infa == None or namespace.infa != None:
    print(help_text)

  • Вопрос задан
  • 3006 просмотров
Решения вопроса 1
Sergomen
@Sergomen Автор вопроса
Просто делай добро и оно вернётся
Как посоветовал Алан Гибизов я прочитал тут и решил проблему заменив codecs.utf_8_decode(ff) на
codecs.decode(ff, encoding='utf-8', errors='replace')
и теперь, насколько я понял, символы которые невозможно прочитать заменяются на другие символы типо "�".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Drill
При открытии указать правильную кодировку файла (выбрать подходящий - 'utf-8', 'cp1251', 'cp866', 'koi8_r', 'koi8_u' и т.д.) :
f = open(file,"rb", encoding='...')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы