2015-03-23 1 views
0

У меня есть текстовый документ, который состоит из нескольких статей, разделенных лексем < нового документа>Как подсчитать статьи и место каждого в списке

Я хотел бы поместить каждую статью в списке

так, например, если у нас есть текстовый файл:

< НОВЫЙ ДОКУМЕНТ> Привет, мир Hello World < НОВЫЙ ДОКУМЕНТ> Early Bird Early Bird

Я хотел List1 быть: Привет, мир Hello World

List2 быть: Early Bird Early Bird

Теперь я не знаю, сколько списков мне нужно создать, поэтому сначала я должен был бы подсчитайте токен < НОВЫЙ ДОКУМЕНТ>.

Во-вторых, я хотел бы разместить каждую статью в списке.

вот моя программа

#program 1 

textFile = open("docs.txt" , "r") 
lines = textFile.read() 


count = 0 

#count how many articles there are 
for line in textFile: 
    if line.strip() == '<NEW DOCUMENT>': 
     count = count + 1 


#place articles in lists 





textFile.close() 

Я получаю 0 для подсчета голосов, и я не знаю, как начать складывать их в списках

+0

Does '< NEW DOCUMENT> 'появляются в строке по отдельности или могут быть другие тексты вместе с ней на этой строке? – inspectorG4dget

+0

Нет, он сам по себе не отображается: Инспектор весов состояния – Mozein

+0

Оператор '==' проверяет равенство. Я думаю, вы хотите использовать оператор 'in' для тестов на сдерживание. – ILostMySpoon

ответ

1

Предполагая, что этот текст документа не гигантский, и предполагая, что вы хотите получить список в виде ['Hello world Hello World', 'Early Bird Early Bird']:

with open('myfile.txt', 'r') as myfile: 
    print([item.strip() for item in myfile.read().split('< NEW DOCUMENT>') if item]) 

Если вы хотите, вложенные списки формы [['Hello', 'world', 'Hello', World'], ['Early', 'Bird', 'Early', 'Bird']]:

with open('myfile.txt', 'r') as myfile: 
    print([[myitem for myitem in item.strip().split(' ')] for item in myfile.read().split('< NEW DOCUMENT>') if item]) 
+0

текст гигантский, каждый <НОВЫЙ ДОКУМЕНТ> на самом деле примерно от 4 до 5 строк. существует около 25 статей или документов. – Mozein

+0

Насколько велика гигантская? Этот аспект заключается в использовании памяти, поэтому, если он составляет менее нескольких сотен МБ, все должно быть хорошо. Если '' имеет один и тот же текст каждый раз, вы можете открыть файл в текстовом редакторе и заменить все экземпляры его более компактным термином, например '' ''. 'splitlines()' занимает больше памяти, но альтернатива с точки зрения памяти - это цикл по линиям, который работает намного лучше, если ему не нужно проверять что-то, что охватывает несколько строк. – TigerhawkT3

+0

это 498 kb, поэтому я думаю, все в порядке. но я должен уметь хранить каждую статью в списке. Здесь все они хранятся в одном списке.Причина, по которой мне нужна каждая в списке, заключается в том, что я создаю поисковую систему для этого документа, и я хочу, чтобы вытащить каждую отдельную статью. Мне это больше нравится List1 = ["Hello world Hello world"] и list2 = ["ранняя птица ранней птицы"]. Это просто простой пример – Mozein

1

Если на линии появится маркер, ничего другого кроме это:

newDoc = "<NEW DOCUMENT>" 
listOfDocumetns = [[]] 
with open('path/to/text/file') as infile: 
    for line in infile: 
     line = line.strip() 
     if line == newDoc: 
      listOfDocuments.append([]) 
      continue 
     listOfDocuments[-1].append(line) 

Если на линии появится маркер, с другим текстом рядом с ним:

newDoc = "<NEW DOCUMENT>" 
listOfDocumetns = [[]] 
with open('path/to/text/file') as infile: 
    for line in infile: 
     line = line.strip() 
     if newDoc not in line: 
      listOfDocuments[-1].append(line) 
      continue 
     while line: 
      left, _, right = line.partition(newDoc) 
      listOfDocuments[-1].append(left) 
      listOfDocuments.append([]) 
      line = right 
+0

это не работает. токен появляется в одной строке. И я хочу, чтобы вытащить каждый документ в конце. поэтому, если мне нужен список 1, я должен уметь его вытащить – Mozein

Смежные вопросы