我有一个文本文件,想要将它读入三个不同的数组中:array1、array2和array3。第一段放在array1中,第二段放在array2中,以此类推。第四段将被放置在array1的第二个元素中,依此类推。段落之间由一个空行分隔。你有什么想法吗?
这是我会尝试的基本代码:
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”应该可以用于将它们拆分。
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
我知道这个问题很久以前就被问过了,但是我想提供一些意见,以便在某个时候对其他人有用。我找到了一种更简单的方法,可以根据段落分隔符(可以是 \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] 将显示第二段落,以此类推。因此,它将输入文件中的所有段落放入列表中,每个列表元素包含输入文件中的一个段落。
这段代码将搜索两个点之间的行:
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)
因为我觉得炫耀一下:
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))
islice
在下一个操作之前尝试完全读取流。很烦人;应该有一种更优雅的方法来多路复用流。@Rob,“段落”通常由文本文件中的换行符定义;如果文本行被明确包装,则OP需要说明,并确定分隔段落的确切内容。 - Karl Knechtel\n\n
作为分隔符,那么将文件读入段落列表非常简单,只需使用f.read().split('\n\n')
即可。尽管由于流处理无法正常工作,所以现在已经没有意义了;最好使用列表切片。 - Karl Knechtel使用切片也可以。
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]
切片语法:[起始索引,终止索引,步长]
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
with open('data.txt', 'r') as f:
。 - MERose