Кодировка и декодирование строки в Python - PullRequest
0 голосов
/ 15 мая 2018

Я хочу записать строку в файл, используя Python. Я знаю, как это сделать, так что это не проблема. Я также хочу закодировать эту строку, как только она будет написана. Кодировка не имеет большого значения, поэтому я буду придерживаться, скажем, UTF-32. Для этого я пишу строку, снова читаю из файла, кодирую строку в байты, а затем перезаписываю в тот же файл. Я могу сделать часть кодирования, но моя проблема возникает с декодированием. Я хочу прочитать его как байты, чтобы я мог преобразовать его обратно в str. Для этого я использую тот же принцип: чтение из файла, декодирование и запись в один и тот же файл. То, что я получаю от чтения закодированной строки, выглядит как b'\xff\xfe\x00\x001\x00\x00\x004\x00\x00\x002\x00\x00\x00'

Когда я читаю это как байты, он удваивает b и обратную косую черту. Если я читаю это так, как строку, а затем пытаюсь декодировать, он продолжает говорить 'str' object does not have attribute decode или что-то в этом роде. Я знаю, что не могу декодировать строку, но если я попробую с байтами, это, кажется, удваивает байты. Вот мой код:

def readfile(filename):
    f = open(filename, 'r')
    s = f.read()
    f.close()
    return s

def readfile_b(filename):
    f = open(filename, 'rb')
    s = f.read()
    f.close()
    return s

def writefile(filename, writeobject):
    f = open(filename, 'w')
    f.write(writeobject)
    f.close()

def encode(filename):
    s = readfile(filename)
    s_enc = bytes(s, 'utf-32')
    writefile(filename, str(s_enc))

def decode(filename):
    s_enc = readfile_b(filename)
    print(s_enc)
    s = str(s_enc, 'utf-32')
    writefile(filename, s)

encode("Example.txt")
decode("Example.txt")

Вывод (для decode (), encode () не было ошибок):

b"b'\\xff\\xfe\\x00\\x00H\\x00\\x00\\x00e\\x00\\x00\\x00l\\x00\\x00\\x00l\\x00\\x00\\x00o\\x00\\x00\\x00'"
Traceback (most recent call last):
  File "C:/bla/bla/bla/bla/Example.py", line 29, in <module>
    decode("MamaAccount.txt")
  File "C:/bla/bla/bla/bla/Example.py", line 26, in decode
    s = str(s_enc, 'utf-32')
UnicodeDecodeError: 'utf-32-le' codec can't decode bytes in position 0-3: code point not in range(0x110000)

Любая помощь с благодарностью

1 Ответ

0 голосов
/ 15 мая 2018

Попробуйте использовать файл записи с двоичной записью.В настоящее время вы пишете байты, приведенные к строке.Когда вы прочитаете это обратно, вы получите ab или 2.

Это работает для меня:

def readfile(filename):
    f = open(filename, 'r')
    s = f.read()
    f.close()
    return s


def readfile_b(filename):
    f = open(filename, 'rb')
    s = f.read()
    f.close()
    return s

def writefile(filename, writeobject):
    f = open(filename, 'w')
    f.write(writeobject)
    f.close()

def writefile_b(filename, writeobject):
    f = open(filename, 'wb')
    f.write(writeobject)
    f.close()

def encode(filename):
    s = readfile(filename)
    s_enc = bytes(s, 'utf-32')
    writefile_b("bin_"+filename, s_enc)

def decode(filename):
    s_enc = readfile_b(filename)
    #print(s_enc)
    s = str(s_enc, 'utf-32')
    print(s)
    writefile("dec_"+filename, s)

encode("Example.txt")
decode("bin_Example.txt")
...