AWK для Python для Mbox - PullRequest
       21

AWK для Python для Mbox

0 голосов
/ 30 марта 2019

Какой наилучший способ Pytonic реализовать эту команду awk в python?

awk 'BEGIN{chunk=0} /^From /{msgs++;if(msgs==500){msgs=0;chunk++}}{print > "chunk_" chunk ".txt"}' mbox

Сейчас я использую это для разделения огромных файлов почтовых ящиков (в формате mbox).

Я сейчас пытаюсь рекурсивный метод.

def chunkUp(mbox, chunk=0):
    with open(mbox, 'r') as bigfile:
        msg = 0
        for line in bigfile:
            if msg == 0: 
                with open("./TestChunks/chunks/chunk_"+str(chunk)+".txt", "a+") as cf:
                    if line.startswith("From "): msg += 1
                    cf.write(line)
                    if msg > 20: chunkUp(mbox, chunk+1)

Мне бы хотелось иметь возможность реализовать это в python и возобновить прогресс, если он прерван.Сейчас работаю над этим.

Я завязываю свой мозг в клочья!Ура!

1 Ответ

0 голосов
/ 30 марта 2019

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

Лучше иметь один дескриптороткройте и запишите в него, закройте и снова откройте новый дескриптор при обнаружении «От».

также откройте ваши файлы в режиме записи, не добавляя.Приведенный ниже код пытается выполнить минимальные операции и тесты, чтобы записать каждую строку в файл, и закрыть / открыть другой файл, когда найден From:.Кроме того, в конце концов, последний файл закрыт.

def chunkUp(mbox):
    with open(mbox, 'r') as bigfile:
        handle = None
        chunk = 0

        for line in bigfile:
            if line.startswith("From "):
                 # next (or first) file
                 chunk += 1
                 if handle is not None:
                    handle.close()
                 handle = None

            # file was closed / first file: create a new one
            if handle is None:
               handle = open("./TestChunks/chunks/chunk_{}.txt".format(chunk), "w")
            # write the line in the current file
            handle.write(line)

         if handle is not None:
             handle.close()

Я не проверял его, но он достаточно прост, он должен работать.Если в первой строке файла не указано «От», все ранее сохраненные строки сохраняются в chunk_0.txt файле.

...