Разделение 25-мегабайтного TXT-файла на файлы меньшего размера с использованием разделителя - PullRequest
0 голосов
/ 13 января 2011

С уважением, ТАК

Я новичок в Python и Perl.Я пытался решить простую проблему и завязать узлы с синтаксисом.Я надеюсь, что у кого-то есть время и терпение, чтобы помочь.У меня есть файл размером 25 МБ в формате «.txt», в котором содержатся статьи в новостных лентах, относящиеся к 1970 году. Каждая новостная статья соединяется с другой, и для разграничения используется только выражение «Авторское право».Каждая новость начинается с «Пункта ХХХ ХХХ ДОКУМЕНТОВ».Существуют определенные метаданные, которые повторяются повсюду, я буду использовать их для пометки позже.

Я хочу разделить этот файл размером 25 Мбайт на отдельные файлы .txt, каждый из которых содержит одну новостную статью (т. Е. Текст между «ДОКУМЕНТАМИ»).и «Авторское право», сохраняя каждое с другим именем (очевидно).

Я пытаюсь 1) открыть файл ... 2) перебрать строки в файле, проверяя разделитель eof, и если оннет записи строки в список 3) записать этот список в отдельный маленький файл.

У меня большие проблемы с изменением имен файлов с помощью счетчика, и как мне заставить Python начать с того места, где я оставилвыключен, уместна ли функция «поиск»?

До сих пор я пробовал этот подход, совершенно безуспешно:

myfile = open ("myfile.txt", 'r')
filenumber = 0
for line in myfile.readline():  
    filenumber += 1    
    w=0  
    while myfile.readline() != '\s+DOCUMENTS\s*\n'  
    ### read my line into a list  
    mysmallfile()['w'] = [myfile.readline()]  
    w += 1  
    output = open('C:\\Users\\dunner7\\Documents\###how do I change the filename      each     iteration???', 'w')  
    output.writelines(mysmallfile)   
    ###go back to start.   

Спасибо за ваше время и терпение.

RD

Вот образец текстового файла:

                           1 of 575 DOCUMENTS

                         The Washington Daybook

                            January 28, 2011

Департамент здравоохранения и социальных служб (HHS);Управление по санитарному надзору за качеством пищевых продуктов и медикаментов (FDA) (FR стр. 72832) проводит заседание Группы неврологических устройств Консультативного комитета по медицинским устройствам для обсуждения и выработки рекомендаций относительно возможной реклассификации устройств, указанных для использования в электросудорожной терапии, 27-28 января.

ВРЕМЯ: 8:00

РАСПОЛОЖЕНИЕ: Hilton Washington DC North / Gaithersburg, Ballroom, 620 Perry Parkway, Gaithersburg, Md.

КОНТАКТ: Джеймс Энглс, 800-741-8138[Примечание: используйте код: 3014512513, для вызова информации.]

ДАТА ПОГРУЗКИ: 28 ноября 2010 г.

ЯЗЫК: АНГЛИЙСКИЙ

ТИП: Встреча

       Copyright 2011 Federal Information and News Dispatch, Inc.


                           2 of 575 DOCUMENTS

                         The Washington Daybook

                            January 27, 2011

Департамент здравоохранения и социальных служб (HHS);Управление по санитарному надзору за качеством пищевых продуктов и медикаментов (FDA) (FR стр. 72832) проводит заседание Группы неврологических устройств Консультативного комитета по медицинским устройствам для обсуждения и выработки рекомендаций относительно возможной реклассификации устройств, указанных для использования в электросудорожной терапии, 27-28 января.

ВРЕМЯ: 8:00

РАСПОЛОЖЕНИЕ: Hilton Washington DC North / Gaithersburg, Ballroom, 620 Perry Parkway, Gaithersburg, Md.

КОНТАКТ: Джеймс Энглс, 800-741-8138[Примечание: используйте код: 3014512513, для вызова информации.]

ДАТА ПОГРУЗКИ: 28 ноября 2010 г.

ЯЗЫК: АНГЛИЙСКИЙ

ТИП: Встреча

       Copyright 2011 Federal Information and News Dispatch, Inc.


                           3 of 575 DOCUMENTS


                              FNS DAYBOOK

                       January 12, 2011 Wednesday
                              FUTURE EVENTS

СОБЫТИЕ: ВСТРЕЧА - ОТДЕЛ ЗДРАВООХРАНЕНИЯ И ЧЕЛОВЕКА (HHS);ПИЩЕВАЯ И ЛЕКАРСТВЕННАЯ АДМИНИСТРАЦИЯ (FDA) (FR СТРАНИЦА 72832);РАСПОЛОЖЕНИЕ: Hilton Washington DC North / Gaithersburg, Ballroom, 620 Perry Parkway, Gaithersburg, Md. - 27 января 2011 г., 8:00

РАЗДЕЛ: ФЕДЕРАЛЬНЫЕ АГЕНТСТВА И ОТДЕЛЕНИЯ - БУДУЩИЕ

ДЛИНА: 72 слова

ПРЕДМЕТ: Департамент здравоохранения и социальных служб (HHS);Управление по санитарному надзору за качеством пищевых продуктов и медикаментов (FDA) (FR стр. 72832) проводит заседание Группы неврологических устройств Консультативного комитета по медицинским устройствам для обсуждения и выработки рекомендаций относительно возможной реклассификации устройств, указанных для использования в электросудорожной терапии, 27-28 января.

КОНТАКТ: Джеймс Энглс, 800-741-8138 [Примечание: используйте код: 3014512513, для вызова информации.]

ДАТА НАГРУЗКИ: 10 января 2011

ЯЗЫК: АНГЛИЙСКИЙ

ТИП ПУБЛИКАЦИИ: Расписания событий

                  Copyright 2011 Federal News Service
                          All Rights Reserved

Ответы [ 2 ]

1 голос
/ 13 января 2011

Несколько проблем на этом пути:

  • Вы используете myfile.readline() в обоих итераторах цикла и при записи в небольшой файл - просто используйте line, если хотите узнать содержимое текущей строки
  • Бит myfile.readline() != 'string' всегда будет давать сбой, на самом деле это не совпадение с регулярным выражением.
  • mysmallfile()['w'] выглядит слишком умно (если вы используете функцию mysmallfile() для возврата массива или словаря, индексированного с помощью 'w', чтобы получить L-значение (!)) Или вы просто отклонились от курса здесь :) 1015 *
  • Вы открываете файл, записываете в него строку, но затем никогда не закрываете файл. Это рецепт для сбоя после 1000 строк, когда у вас заканчиваются дескрипторы открытых файлов.

В предложении Носкло было много очистки, надеюсь, мой пост поможет вам понять, как он дошел до своего. :)

1 голос
/ 13 января 2011

Примерно так:

filenumber = 0
outfile = None
with open('source_file.txt') as f:
    for line in f:
        if line.strip() == 'DOCUMENTS':
            filenumber += 1
            outfile = open('result%03d.txt' % filenumber, 'w')
        elif line.strip().startswith('Copyright') and outfile:
            outfile.close()
            outfile = None
        elif outfile:
            outfile.write(line)
if outfile:
    outfile.close()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...