2016-02-15 4 views
2

У меня очень большой текстовый файл на диске. Предположим, что это 1 ГБ или больше. Также предположим, что данные в этом файле имеют символ \n каждые 120 символов.Как зашифровать большой набор данных, используя python-gnupg, не всасывая всю память?

Я использую python-gnupg для шифрования этого файла. Поскольку файл настолько велик, я не могу прочитать весь файл в памяти за один раз.

Однако метод gnupg.encrypt(), который я использую, требует, чтобы я отправлял сразу все данные - не в кусках. Итак, как я могу зашифровать файл, не используя всю свою системную память?

Вот некоторые примеры код:

import gnupg 
gpg = gnupg.GPG(gnupghome='/Users/syed.saqibali/.gnupg/') 

for curr_line in open("VeryLargeFile.txt", "r").xreadlines(): 
    encrypted_ascii_data = gpg.encrypt(curr_line, "[email protected]") 
    open("EncryptedOutputFile.dat", "a").write(encrypted_ascii_data) 

Этот пример дает неверный выходной файл, потому что я не могу просто сцепить зашифрованные сгустки вместе в файл.

ответ

1

Шифрование строки для строки приводит к большому количеству документов OpenPGP, что не только упростит дешифрование, но и значительно увеличит размер файла и вычислительные усилия.

Модуль GnuPG для Python также знает способ encrypt_file, который принимает поток в качестве входного сигнала и знает необязательный параметр output, чтобы напрямую записать результат в файл.

with open("VeryLargeFile.txt", "r") as infile: 
    gpg.encrypt_file(
      infile, "[email protected]", 
      output="EncryptedOutputFile.dat") 

Это приводит к потоковому поведению с постоянными и низкими требованиями к памяти.