I have a text file, I want to read this text file into 3 different arrays, array1 array2 and array3. the first paragraph gets put in array1, the second paragraph gets put in array2 and so on. the 4th paragraph will then be put in array1 element2 and so forth, paragraphs are separated by a blank line. any ideas?
7 Answers
This is the basic code I would try:
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]
This should be enough to get you started. If the paragraphs in the file are split by two new lines then "\n\n" should do the trick for splitting them.
1 Comment
with open('data.txt', 'r') as f: would be preferable.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 Comment
I know this question was asked long before but just putting my inputs so that it will be useful to somebody else at some point of time. I got to know much easier way to split the input file into paragraphs based on the Paragraph Separator(it can be a \n or a blank space or anything else) and the code snippet for your question is given below :
with open("input.txt", "r") as input:
input_ = input.read().split("\n\n") #\n\n denotes there is a blank line in between paragraphs.
And after executing this command, if you try to print input_[0] it will show the first paragraph, input_[1] will show the second paragraph and so on. So it is putting all the paragraphs present in the input file into an List with each List element contains a paragraph from the input file.
Comments
Because I feel like showing off:
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))
6 Comments
list. What's the problem? Edit: tested and found that everything ends up in the first iterator, for reasons I don't understand. This is fixed by reading from a list instead of a stream (which is what I tested originally); edited accordingly.islice attempts to read the stream fully before the next gets to operate. Annoying; there ought to be a more elegant way to multiplex a stream. @Rob "paragraphs" are normally defined by newlines in text files; if the lines of text are explicitly wrapped then the OP needs to say so, and identify exactly what separates paragraphs.islice issues is an interesting one.More elegant way to bypass slices:
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
Just make sure you deal with None in final text