У меня есть текстовый файл с таким содержимым:
__META__
Autore [email protected]
Data 2011/09/29_11:37:00
Sorgente Non applicabile
Layout 1.0.0
Copyright MyCompany
Note Standard_Build
__INFO__
Nome PACKAGE-NAME
CodiceProduzione PKG_CODE
Descrizione Descriptiom
ChangeOwner [email protected]
Vendor sigla=IC nome=MyCompany-SD
__SOURCE__
#Server oldserver.mycompany.com
Server newserver.mycompany.com
__CONTENTS__
_dir_ dir=/opt/package/x uid=user gid=group mode=755 policy=nn
#_dir_ dir=/tmp uid=user gid=group mode=755 policy=nn
_file_ file=/opt/package/x/file1 uid=user gid=group mode=600 policy=nn
_file_ file=/opt/package/x/file2 uid=user gid=group mode=755 policy=fv
_file_ file=/opt/package/x/file3 uid=user gid=group mode=755 policy=fv
__SCRIPT__
postinstall scr=/opt/package/x/file1.sh
__END__
Затем я открываю файл и кодирую содержимое в base64, например так:
import base64
MetaFile = '/path/file.tx'
data = open(MetaFile, "r").read()
data_byte = data.encode("utf-8")
MetaFile_encode = base64.b64encode(data_byte)
MetaFile_decode = base64.b64decode(MetaFile_encode)
print(MetaFile_encode)
print(MetaFile_decode)
Строка print(MetaFile_encode)
показывает содержимое файла в кодировке base64:
b'X19NRVRBX18KQXV0b3JlICAgICAgICAgICAgIG15bmFtZUBteWNvbXBhbnkuY29tCkRhdGEgICAgICAgICAgICAgICAyMDExLzA5LzI5XzExOjM3OjAwClNvcmdlbnRlICAgICAgICAgICBOb24gYXBwbGljYWJpbGUKTGF5b3V0ICAgICAgICAgICAgIDEuMC4wCkNvcHlyaWdodCAgICAgICAgICBNeUNvbXBhbnkKTm90ZSAgICAgICAgICAgICAgIFN0YW5kYXJkX0J1aWxkCl9fSU5GT19fCk5vbWUgICAgICAgICAgICAgICBQQUNLQUdFLU5BTUUKQ29kaWNlUHJvZHV6aW9uZSAgIFBLR19DT0RFCkRlc2NyaXppb25lICAgICAgICBEZXNjcmlwdGlvbQpDaGFuZ2VPd25lciAgICAgICAgb3JnYW5pemF0aW9uYWwudW5pdEBteWNvbXBhbnkuY29tClZlbmRvciAgICAgICAgICAgICBzaWdsYT1JQyBub21lPU15Q29tcGFueS1TRApfX1NPVVJDRV9fCiNTZXJ2ZXIgICAgICAgICAgICAgb2xkc2VydmVyLm15Y29tcGFueS5jb20KU2VydmVyICAgICAgICAgICAgIG5ld3NlcnZlci5teWNvbXBhbnkuY29tCl9fQ09OVEVOVFNfXwpfZGlyXyAgICAgICAgICAgICAgZGlyPS9vcHQvcGFja2FnZS94IHVpZD11c2VyIGdpZD1ncm91cCBtb2RlPTc1NSBwb2xpY3k9bm4KI19kaXJfICAgICAgICAgICAgICBkaXI9L3RtcCAgdWlkPXVzZXIgZ2lkPWdyb3VwIG1vZGU9NzU1IHBvbGljeT1ubgpfZmlsZV8gICAgICAgICAgICAgZmlsZT0vb3B0L3BhY2thZ2UveC9maWxlMSB1aWQ9dXNlciBnaWQ9Z3JvdXAgbW9kZT02MDAgcG9saWN5PW5uCl9maWxlXyAgICAgICAgICAgICBmaWxlPS9vcHQvcGFja2FnZS94L2ZpbGUyIHVpZD11c2VyIGdpZD1ncm91cCBtb2RlPTc1NSBwb2xpY3k9ZnYKX2ZpbGVfICAgICAgICAgICAgIGZpbGU9L29wdC9wYWNrYWdlL3gvZmlsZTMgdWlkPXVzZXIgZ2lkPWdyb3VwIG1vZGU9NzU1IHBvbGljeT1mdgpfX1NDUklQVF9fCnBvc3RpbnN0YWxsICAgICAgICBzY3I9L29wdC9wYWNrYWdlL3gvZmlsZTEuc2ggCl9fRU5EX18KCg=='
Но когда я декодирую в base64 «MetaFile_encode», я больше не получаю вывод, отформатированный как оригинал, и вместо новой строки я получаю символ «\n», например:
b'__META__\nAutore [email protected]\nData 2011/09/29_11:37:00\nSorgente Non applicabile\nLayout 1.0.0\nCopyright MyCompany\nNote Standard_Build\n__INFO__\nNome PACKAGE-NAME\nCodiceProduzione PKG_CODE\nDescrizione Descriptiom\nChangeOwner [email protected]\nVendor sigla=IC nome=MyCompany-SD\n__SOURCE__\n#Server oldserver.mycompany.com\nServer newserver.mycompany.com\n__CONTENTS__\n_dir_ dir=/opt/package/x uid=user gid=group mode=755 policy=nn\n#_dir_ dir=/tmp uid=user gid=group mode=755 policy=nn\n_file_ file=/opt/package/x/file1 uid=user gid=group mode=600 policy=nn\n_file_ file=/opt/package/x/file2 uid=user gid=group mode=755 policy=fv\n_file_ file=/opt/package/x/file3 uid=user gid=group mode=755 policy=fv\n__SCRIPT__\npostinstall scr=/opt/package/x/file1.sh \n__END__\n\n'
Что нужно сделать, чтобы декодированный текст был отформатирован как исходный?
Другими словами: что произойдет, если вы попробуете print(data_byte)
сразу после его вычисления? Что бы вы сделали, чтобы вернуть оригинал data
?
Вы закодировали base64 уже закодированную строку UTF-8. Декодирование base64 вернуло эту строку в кодировке UTF-8. Вы видите его как объект bytes
, начинающийся с b'
и экранирующий непечатаемые символы, такие как \n
. Решение — еще один шаг: декодировать байты UTF-8 в строку.
import base64
MetaFile = '/path/file.tx'
data = open(MetaFile, "r").read()
data_byte = data.encode("utf-8")
MetaFile_encode = base64.b64encode(data_byte)
MetaFile_decode = base64.b64decode(MetaFile_encode)
data_decode = MetaFile_decode.decode("utf-8")
print(MetaFile_encode)
print(MetaFile_decode)
print(data_decode)
Добро пожаловать в Stack Overflow. Тщательно продумайте шаги, которые были предприняты в коде. Сначала мы преобразовали
str
вbytes
, используя кодировку UTF-8; затем мы преобразовали этиbytes
в другиеbytes
, используя base64. Итак, чтобы изменить это, нам нужно использовать base64 в обратном порядке, чтобы преобразоватьbytes
в кодировку UTF-8bytes
, что мы и видим в вопросе... и что потом? Я голосую за то, чтобы закрыть это как опечатку, потому что проблема связана с простыми рассуждениями, а не из-за недостатка знаний.