Как записать файл в переменную, а затем восстановить его из переменной?

FactoREAL

Добрый день. Подскажите как можно прочитать файл (любой. текстовый, картинку, исполняемый и т.п.) и записать прочитанное в переменную. а затем, записать из этой переменной обратно в файл, что бы получился исходных рабочий файл. я приблизительно понимаю что нужно выполнить двоичное чтение файла, но вот как именно сохранить прочитанное в переменную, что бы потом из нее можно было восстановить исходный файл - не понимаю.

data = open('file.exe', 'rb').read()
storage = str(data)

так я, к примеру, получаю текстовое представление прочитанных байт. Но не понимаю как правильно их записать в другой файл что бы в итоге получился исходный файл. мне не обязательно хранить прочитанное в текстовом виде, можно и в массиве и как угодно. чем компактнее будет запись, тем лучше. копировать файл не предлагать =) мне нужно как бы "зашить" файл в скрипт, что бы при необходимости можно было из питоновского скрипта восстановить файл.

4 ответа

FactoREAL

with open(r'image.png', 'rb') as file: # Путь к файлу который нужно прочесть
    var = file.read() # "Записываем" файл в переменную
with open(r'new_image.png', 'wb') as file_2: # Путь  и имя нового файла
    file_2.write(var) # Записываем все что в переменной в новый файл

UPD

Так все работает:

var = b'\x89PNG\r\n\x1a\n\x00\x00\...'
with open(r'image.png', 'wb') as file_2:
    file_2.write(var)


FactoREAL

Предложу свой вариант:

import base64

input_name = 'data.dat'
restored_name = 'data_restored.dat'
with open(input_name, 'rb') as input_file:
    data = input_file.read()

b64 = base64.b64encode(data)
with open('restore.py', 'w') as output_file:
    output_file.write('import base64\n')
    output_file.write('b64="{}"\n'.format(b64))
    output_file.write('output_name = "{}"\n'.format(restored_name))
    output_file.write('data=base64.b64decode(b64)\n')
    output_file.write('with open(output_name, "wb") as output_file:\n')
    output_file.write('    output_file.write(data)\n')

Этот скрипт читает файл с именем из переменной input_name и создаёт файл restore.py, при запуске которого данные из входного файла будут восстановлены в файл с именем из переменной restored_name.


FactoREAL

Похоже вы хотите сохранить произвольные двоичные данные в виде строковой константы в исходном коде Питона.

>>> import codecs; codecs.encode(b'abc', 'zip').hex()
'789c4b4c4a0600024d0127'
>>> zipped_hex_data = _

И в обратную сторону:

>>> codecs.decode(binascii.unhexlify(zipped_hex_data), 'zip')
b'abc'

См. Embedding binary data in a script efficiently.

Подобные приёмы мне встречались в скриптах установщиках, которые включали в себя другие файлы в виде строк: то есть вы копируете один файл и запускаете — как самораспаковывающийся архив. В зависимости от вашей конкретной ситуации, могут существовать лучшие альтернативы. К примеру, можно использовать ***********, чтобы упаковать несколько Питон модулей в один файл или в виде простой альтернативы: можно просто создать исполняемый zip-архив.


FactoREAL

Вариант с использованием хранилища. Первый скрипт сохраняет фото в хранилище, а второй извлекает их.

import shelve

shelfFile = shelve.open('myfoto')
with open('pict1.jpg', 'rb') as file1:
    pict1 = file1.read()
with open('pict2.jpg', 'rb') as file2:
    pict2 = file2.read()
shelfFile['pict1'] = pict1
shelfFile['pict2'] = pict2
shelfFile.close() 




import shelve

shelfFile = shelve.open('myfoto')
with open('pict11.jpg', 'wb') as file1:
    file1.write(shelfFile['pict1'])
with open('pict22.jpg', 'wb') as file2:
    file2.write(shelfFile['pict2'])
shelfFile.close()

licensed under cc by-sa 3.0 with attribution.