将文件读入由Python段分隔的数组中

时间:2011-11-27 01:22:50

标签: python arrays parsing

我有一个文本文件,我想将这个文本文件读入3个不同的数组,array1 array2和array3。第一段放在array1中,第二段放在array2中,依此类推。然后将第4段放在array1 element2中,依此类推,段落用空行分隔。任何想法?

7 个答案:

答案 0 :(得分:9)

这是我尝试的基本代码:

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”应该可以分割它们。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

因为我想炫耀一下:

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))

答案 3 :(得分:1)

我知道很久以前就问过这个问题但只是提出我的意见,以便在某些时候对其他人有用。 我知道更容易的方法将输入文件拆分成段落分隔符(它可以是\ 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]将显示第二段,依此类推。因此,它将输入文件中存在的所有段落放入List中,每个List元素都包含输入文件中的段落。

答案 4 :(得分:0)

使用切片也可以。

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] 

在切片中:[开始索引,结束索引,步骤]

答案 5 :(得分:0)

更优雅的绕过切片的方法:

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

请确保在最终文本中处理无

答案 6 :(得分:0)

此代码将搜索两点之间的线:

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)