читать файл в массив, разделенный абзацем Python - PullRequest
6 голосов
/ 27 ноября 2011

У меня есть текстовый файл, я хочу прочитать этот текстовый файл в 3 различных массива, массив1 массив2 и массив3. первый абзац помещается в массив1, второй абзац помещается в массив2 и так далее. затем четвертый абзац будет помещен в array1 element2 и т. д., абзацы разделены пустой строкой. есть идеи?

Ответы [ 7 ]

9 голосов
/ 27 ноября 2011

Это основной код, который я бы попробовал:

f = open('data.txt', 'r')

data = f.read()
array1 = []
array2 = []
array3 = []
splat = data.split("\n\n")
for number, paragraph in enumerate(splat, 1):
    if number % 3 == 1:
        array1 += [paragraph]
    elif number % 3 == 2:
        array2 += [paragraph]
    elif number % 3 == 0:
        array3 += [paragraph]

Этого должно быть достаточно, чтобы начать работу.Если абзацы в файле разделены двумя новыми строками, то "\ n \ n" должно решить проблему их разделения.

2 голосов
/ 27 ноября 2011
import itertools as it


def paragraphs(fileobj, separator='\n'):
    """Iterate a fileobject by paragraph"""
    ## Makes no assumptions about the encoding used in the file
    lines = []
    for line in fileobj:
        if line == separator and lines:
            yield ''.join(lines)
            lines = []
        else:
            lines.append(line)
    yield ''.join(lines)

paragraph_lists = [[], [], []]
with open('/Users/robdev/Desktop/test.txt') as f:
    paras = paragraphs(f)
    for para, group in it.izip(paras, it.cycle(paragraph_lists)):
        group.append(para)

print paragraph_lists
1 голос
/ 18 сентября 2017

Я знаю, что этот вопрос задавался задолго до этого, но я просто добавил свои данные, чтобы в какой-то момент он был полезен кому-то еще. Я узнал гораздо более простой способ разбить входной файл на абзацы на основе разделителя абзацев (это может быть \ n или пробел или что-то еще), а фрагмент кода для вашего вопроса приведен ниже:

with open("input.txt", "r") as input:
    input_ = input.read().split("\n\n")   #\n\n denotes there is a blank line in between paragraphs.

И после выполнения этой команды, если вы попытаетесь напечатать input_ [0], он покажет первый абзац, input_ [1] покажет второй абзац и так далее. Таким образом, он помещает все абзацы, присутствующие во входном файле, в список, причем каждый элемент списка содержит абзац из входного файла.

1 голос
/ 27 ноября 2011

Потому что мне хочется хвастаться:

with open('data.txt') as f:
    f = list(f)
    a, b, c = (list(__import__('itertools').islice(f, i, None, 3)) for i in range(3))
0 голосов
/ 01 мая 2019

Этот код будет искать линии между двумя точками:

rr = [] #Array for saving lines    
for f in file_list:
    with open(f, 'rt') as fl:
        lines = fl.read()
        lines = lines[lines.find('String1'):lines.find('String2')] 
        rr.append(lines)
0 голосов
/ 04 января 2017

Более элегантный способ обхода ломтиков:

def grouper(n, iterable, fillvalue=None):
    args = [iter(iterable)] * n
    return itertools.izip_longest(fillvalue=fillvalue, *args)

for p in grouper(5,[sent.strip() for sent in text.split('\n') if sent !='']):
    print p

Просто убедитесь, что вы имеете дело с None в конечном тексте

0 голосов
/ 10 декабря 2011

Использование ломтиков также будет работать.

par_separator = "\n\n"
paragraphs = "1\n\n2\n\n3\n\n4\n\n5\n\n6".split(par_separator)
a,b,c = paragraphs[0:len(paragraphs):3], paragraphs[1:len(paragraphs):3],\
        paragraphs[2:len(paragraphs):3] 

Внутри среза: [начальный индекс, конечный индекс, шаг]

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