Как я могу прочитать файл в 9-мегабайтных блоков в Python? - PullRequest
2 голосов
/ 24 октября 2019

После того, как я распаковал файл:

fin = open("foo.mp4", "rb")
fout = gzip.open("data.tmp", "wb")
fout.write(fin.read())
fout.close()
fin.close()

Я хочу загрузить файл (файл может иметь любой размер) в память в 9 мегабайтных блоках.

Каждый блок должен быть 9 МБпоследний может быть меньше. Мне нужен этот размер для того, чтобы загрузить данные в POST-конечную точку, которая принимает только <= 9 МБ размера файла. </p>

Любая идея, как читать файл без необходимости выполнять вызовы подпроцесса для split

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете указать количество байтов для чтения в файле read метод.

file.read ([размер])

Чтение в максимальном размеребайтов из файла (меньше, если чтение достигает EOF перед получением байтов размера). Если аргумент размера отрицателен или опущен, считывайте все данные до достижения EOF. Байты возвращаются как строковый объект. Пустая строка возвращается, когда EOF встречается немедленно. (Для некоторых файлов, таких как ttys, имеет смысл продолжить чтение после нажатия EOF.) Обратите внимание, что этот метод может вызывать базовую функцию C fread () более одного раза, чтобы получить как можно более близкие к размеру байты. Также обратите внимание, что в неблокирующем режиме может быть возвращено меньше данных, чем было запрошено, даже если не задан параметр размера.

Вы можете использовать seek для перехода к следующемуposition

file.seek (offset [, wherece])

Установить текущую позицию файла, как в stdio fseek (). Аргумент wherece является необязательным и по умолчанию имеет значение os.SEEK_SET или 0 (абсолютное позиционирование файла);другие значения: os.SEEK_CUR или 1 (поиск относительно текущей позиции) и os.SEEK_END или 2 (поиск относительно конца файла). Возвращаемого значения нет.

Например, f.seek (2, os.SEEK_CUR) увеличивает позицию на два, а f.seek (-3, os.SEEK_END) устанавливает позицию от третьей до последней.

Обратите внимание, что если файл открывается для добавления (режим 'a' или 'a +'), любые операции поиска () будут отменены при следующей записи. Если файл открывается только для записи в режиме добавления (режим «a»), этот метод по сути является запретным, но он остается полезным для файлов, открытых в режиме добавления с включенным чтением (режим «a +»). Если файл открывается в текстовом режиме (без 'b'), допустимы только смещения, возвращаемые функцией tell (). Использование других смещений вызывает неопределенное поведение

1 голос
/ 24 октября 2019

Вы можете использовать метод seek(), который получает в качестве параметра смещение и перемещается на определенный байт (символ):

offset = 9216  # 9MB
fin.seek(offset, 1)

Таким образом, вы начинаете с 0 и после того, как прочитали его, добавляетедля смещения 9216 или что вы хотите

...