Изменить код для создания файла во вновь созданной папке

#python

#python

Вопрос:

Из https://raspberrypi.stackexchange.com/questions/26714/can-i-record-a-24-hour-video-on-the-raspberry-pi-with-camera-module Я пытаюсь изменить код :

 import io
import itertools
import picamera

def outputs():
    for i in itertools.count(1):
        yield io.open('filed.h264' % i, 'wb')

with picamera.PiCamera() as camera:
    camera.resolution = (640, 360)
    camera.framerate = 24
    for output in camera.record_sequence(
            outputs(), quality=20, bitrate=750000):
        while output.tell() < 1048576:
            camera.wait_recording(0.1)
        if output.name == 'file99.h264':
            break
  

Этот код «создаст 100 файлов, переходящих, как только каждый из них достигнет> 1 МБ»,

Я пытаюсь изменить так, чтобы после того, как файл достигнет> 5 МБ, создавался новый файл. Должны быть созданы каталоги от 1 до 100, каждый из которых содержит не более 100 файлов. Вот мой прогресс на данный момент :

 import io
import itertools
import picamera
import os

def outputs():
    for i in itertools.count(1):
        yield io.open('filed.h264' % i, 'wb')

for i in range(1 , 101) :

    os.mkdir(str(i))
    with picamera.PiCamera() as camera:
        camera.resolution = (640,480)
        camera.framerate = 24
        for output in camera.record_sequence(
                outputs(), quality=20, bitrate=750000):
            while output.tell() < 5048576:
                camera.wait_recording(0.1)
            if output.name == 'file99.h264':
  

Как создать файл во вновь созданной папке и проверить эту вновь созданную папку на то, что она содержит 100 файлов?

Ответ №1:

Вы можете использовать первый фрагмент кода и изменить его output функцию:

 def outputs():
    dir_count = 0
    current_dir = 'dir{}'

    for i in itertools.count(1):
        if not (i % 100):
            dir_count  = 1
            os.mkdir(current_dir.format(dir_count))
        yield io.open((current_dir   '/file{:02d}.h264').format(current_dir, i % 100), 'wb')
  

Или короче:

 def outputs():
    yield from (
        io.open('dir{}/file{:02d}.h264'.format(dir, i), 'wb')
        for dir in itertools.count(1)
        for i in range(100)
        if os.makedirs('dir{}'.format(dir), exist_ok=True) is None
    )
  

Когда количество файлов в каталоге равно 10, будут созданы следующие файлы:

 $ ls -h ./*
./dir1:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir10:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir11:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir12:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir13:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir14:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir15:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir16:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir17:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir18:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir19:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir2:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir20:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

./dir21:
file00.h264 file02.h264 file04.h264 file06.h264 file08.h264
file01.h264 file03.h264 file05.h264 file07.h264 file09.h264

# the list goes on and on...
  

ВНИМАНИЕ!Не забудьте закрыть открытые файлы, потому что их будет много, и вы получите сообщение об открытии слишком большого количества файлов одновременно, если вы их не закроете.