基本上我想从文本文件中读取字符串,将它们放在三个列表中,然后将三个列表中的所有三个放入另一个列表中。其实让我更好地解释一下:)
文本文件(只是一个例子,我可以根据需要构建它):
party
sleep
study
--------
party
sleep
sleep
-----
study
sleep
party
---------
等
由此,我希望Python创建一个如下所示的列表:
List1 = [['party','sleep','study'],['party','sleep','sleep'],['study','sleep','party']etc]
但这太难了。我正在尝试类似的事情:
test2 = open('test2.txt','r')
List=[]
for line in 'test2.txt':
a = test2.readline()
a = a.replace("\n","")
List.append(a)
print(List)
但这只是可怕的可怕事情。怎么做到这一点?
答案 0 :(得分:4)
如果要将数据分组为3 。假设文本文件中的数据未按任何分隔符分组。
您需要按顺序读取文件并创建列表。要对其进行分组,您可以使用任何已知的grouper algorithms
from itertools import izip, imap
with open("test.txt") as fin:
data = list(imap(list, izip(*[imap(str.strip, fin)]*3)))
pprint.pprint(data)
[['party', 'sleep', 'study'],
['party', 'sleep', 'sleep'],
['study', 'sleep', 'party']]
执行步骤
考虑到所有都是生成器表达式,它在一次迭代中完成。
相反,如果您的数据被分隔并按分隔符------
分组,则可以使用itertools.groupby
解决方案
from itertools import imap, groupby
class Key(object):
def __init__(self, sep):
self.sep = sep
self.count = 0
def __call__(self, line):
if line == self.sep: self.count += 1
return self.count
with open("test.txt") as fin:
data = [[e for e in v if "----------" not in e]
for k, v in groupby(imap(str.strip, fin), key = Key("----------"))]
pprint.pprint(data)
[['party', 'sleep', 'study'],
['party', 'sleep', 'sleep'],
['study', 'sleep', 'party']]
执行步骤
itertools.groupby
并使用自定义密钥答案 1 :(得分:3)
你可以试试这个:
res = []
tmp = []
for i, line in enumerate(open('file.txt'), 1):
tmp.append(line.strip())
if i % 3 == 0:
res.append(tmp)
tmp = []
print(res)
我以为你没有破折号。
编辑:
以下是破折号的示例:
res = []
tmp = []
for i, line in enumerate(open('file.txt')):
if i % 4 == 0:
res.append(tmp)
tmp = []
continue
tmp.append(line.strip())
print(res)
答案 2 :(得分:0)
第一个大问题:
for line in 'test2.txt':
给你
't', 'e', 's', 't', '2', '.', 't', 'x', 't'
您需要遍历打开的文件:
for line in test2:
或者,更好:
with open("test2.txt", 'r') as f:
for line in f:
接下来,您需要做以下两件事之一:
"-----"
,请创建一个新的子列表(myList.append([])
)myList[-1].append(line)
)最后,你的print
最后不应该缩进;目前,它为每一行打印,而不是仅在处理完成时打印。
List.append(a)
print(List)
或许文件的结构更好:
party,sleep,study
party,sleep,sleep
...
现在每一行都是一个子列表:
for line in f:
myList.append(line.split(','))